【问题标题】:Left Join in Django Model Multi-table Inheritance in Admin app管理应用程序中的 Django 模型多表继承中的左连接
【发布时间】:2012-06-07 07:08:27
【问题描述】:

场景:

假设我想使用多表继承来扩展 Django 的 User 模型。假设我为此创建的模型称为CustomUser

现在假设数据库中已经存在User模型对应的记录,而CustomUser模型对应的表仍然是空的。

现在我希望可以从 Django 的管理应用程序访问 CustomUser 模型。我注意到只有在 CustomUser 表中具有相应记录的用户模型记录包含在 CustomUser 的 更改列表 中,就好像在查询中正在后台执行 INNER JOIN... (我使用connection.queries 进行了检查,它确实是一个 INNER JOIN)。

现在我想更改此行为,以便完成 LEFT JOIN 以检索与 CustomerUser 相关的记录。

如何在 Django 中实现这一点?

非常感谢!

【问题讨论】:

  • 如何定义 CustomUser 模型并在 Django Admin 中使用它?
  • 我使用docs.djangoproject.com/en/1.2/topics/db/models/… 中描述的多表继承定义了 CustomUser 模型,并以通常的方式在 Django Admin 中显示它,即在名为 admin.py 的文件中注册它。没有自定义它...
  • 也许我真正想做的是让我在 CustomUser 模型中定义的那些附加字段可以从管理页面中的用户模型页面访问。如何让 User 模型(或者可能是管理页面)知道 CustomUser 中定义的那些附加字段...

标签: django django-models django-admin


【解决方案1】:

把下面的任何工作 admin.py.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
#### below imports your custom user model
from accounts.models import CustomUser   

admin.site.unregister(User)

class UserProfileInline(admin.StackedInline):
    model = CustomUser   

class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline, ]

admin.site.register(User, UserProfileAdmin)

上面将在管理员中的用户中显示您的CustomUser 模型。现在您可以通过 User__first_name 等从 UserProfileAdmin 访问用户字段。请原谅英语不好。

【讨论】:

  • 几乎,但并没有真正解决问题。发生的事情是,由于 CustomUser 继承自 User(多表继承),CustomUser 被视为一个单独的对象,该对象还包含它从 User 继承的所有属性。因此,这些继承的字段在与 CustomUser 相关的内联视图中重复显示...
  • 如果我定义一对一关系而不是在两个模型之间使用多表关系,则此方法有效...谢谢!
  • 从技术上讲,它们之间是一对一的关系,如多表继承的实现中所述。
  • 使用exclude 尝试排除这些字段。
猜你喜欢
  • 2013-11-30
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 2012-04-20
相关资源
最近更新 更多