【问题标题】:Django Admin: Intersection (Natural Inner Join) between Two ModelsDjango Admin:两个模型之间的交集(自然内连接)
【发布时间】:2016-03-17 12:38:03
【问题描述】:

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

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 中加入这两个模型,以便管理用户可以在一个页面上查看所有用户信息(个人详细信息和受益人详细信息)。所以,我想在“用户”字段上对上述表格进行内部连接。 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 以加入表格。但是,我认为这不会起作用……似乎“select_related”只是规定外键的另一种方式。我现在想使用原始 SQL 来加入表。我尝试使用游标函数来实现原始 SQL,但我不太清楚如何实现它,以便输出显示在 Django 的管理界面中。另外,我有点害怕使用原始 SQL,因为据我了解,原始 SQL 会引入安全风险(我读过 Django 的 ORM 可以防止 SQL 注入)。

感谢您的帮助。

【问题讨论】:

    标签: sql django join orm admin


    【解决方案1】:

    你不能用 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,
        ]
    

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2018-10-11
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多