首页 > 解决方案 > 在 Django Admin 中包含来自 OneToOneField 的字段

问题描述

我正在尝试将 OneToOneField 中的字段添加到我的管理视图中。这是我的模型外观的示例。

class Customer(BaseUser):
    name = CharField()
    address = CharField()
    secondary_information = OneToOneField("SecondaryCustomerInfo", on_delete=SET_NULL, null=True)


class SecondaryCustomerInfo(models.Model):
    email = EmailField()

我尝试像这样将字段添加为内联。

class SecondaryCustomerInfoInline(admin.StackedInline):
    model = SecondaryCustomerInfo


class CustomerAdmin(admin.ModelAdmin):
    inlines = [SecondaryCustomerInfoInline]

但我得到了错误

<class 'user.admin.SecondaryCustomerInfoInline'>: (admin.E202) 'user.SecondaryCustomerInfo' has no ForeignKey to 'user.Customer'.

我习惯于将 OneToOneField 放在辅助模型上,但我的同事要求我将它放在主 Customer 模型上,因为我们将更频繁地访问该信息。我认为改变事情是让我绊倒的原因。如何在客户的管理视图中包含来自 SecondaryCustomerInfo 的字段?

标签: djangodjango-modelsdjango-admininlines

解决方案


答案是使用Django Reverse Admin

从其文档中:

使 django admin 以更好的方式处理 OneToOneFields 的模块。一对一关系的一个常见用例是将模型“嵌入”到另一个模型中。例如,一个人可能有多个指向地址实体的外键、一个家庭地址、一个公司地址等。Django 管理员使用选择框显示这些关系,让用户选择要连接到人的地址实体。处理这种关系的一种更自然的方式是使用内联。但是,由于外键放置在拥有实体上,因此无法使用 django 管理员标准内联类。

class CustomerAdmin(ReverseModelAdmin):
    inline_type = 'stacked'
    inline_reverse = ['secondary_information']

推荐阅读