Django Admin:两个模型之间的交集(自然内部连接)

Django Admin: Intersection (Natural Inner Join) between Two Models

我是 Django 初学者。我有两个模型,我想在 Django 管理界面中显示为一个 table。以下是模型的简化版本:

class Final_Application_Personal_Detail(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=20)
    id_no = models.CharField(max_length=14)

class Final_Application_Beneficiary_Detail(models.Model):
    user = models.ForeignKey(User)
    beneficiary_name = models.CharField(max_length=20)
    beneficiary_id_no = models.CharField(max_length=14)

我想因为这两个模型在概念上构成了一个表单(一个 Final_Application 表单)的一部分,我本可以使用 Django 的表单向导 - 但是,因为实际上个人详细信息和受益人详细信息都很多填写,我想我想让用户有机会单独填写它们(据我所知,在 django formwizard 中,如果用户没有一次填写所有数据,那么所有以前的数据也丢失了,因为无法使用未验证的字段保存表单)。

我想在Django admin中加入这两个模型,这样管理用户就可以在一个页面上看到一个用户的所有信息(个人详细信息和受益人详细信息)。所以,我想对字段 'user' 上的上述 table 进行内部连接。 SQL 看起来像这样:

SELECT *
FROM Final_Application_Personal_Detail
  JOIN Final_Application_Beneficiary_Detail
  ON Final_Application_Personal_Detail.user = Final_Application_Beneficiary_Detail.user

关于 Django 的 ORM,我研究了关键字参数 related_to 以加入 table。我不认为这会起作用,但是......似乎 'select_related' 只是另一种规定外键的方式。我现在想使用原始 SQL 来加入 table。我已经尝试使用游标函数来实现原始 SQL,但我不太清楚如何实现它以便输出显示在 Django 的管理界面中。另外,我有点害怕使用 raw SQL,因为据我了解,raw SQL 会引入安全风险(我读过 Django 的 ORM 可以防止 SQL 注入).

感谢您的帮助。

您不能使用 django admin 执行此操作。但是,您可以使用 inlines 在用户管理中编辑这两个模型。

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin

class Final_Application_Personal_DetailInline(admin.StackedInline):
    model = Final_Final_Applicationl_Detail

class Final_Application_Beneficiary_DetailInline(admin.StackedInline):
    model = Final_Final_Application_Beneficiary_Detail

admin.site.unregister(User)

@admin.register(User)
class CustomUserAdmin(UserAdmin):
    inlines = [
        Final_Application_Personal_DetailInline,
        Final_Application_Beneficiary_DetailInline,
    ]