【问题标题】:How to deal with multiple sub-type of one super-type in Django admin如何在 Django admin 中处理一种超类型的多个子类型
【发布时间】:2010-03-15 02:02:31
【问题描述】:

添加/编辑多个子类型的最佳解决方案是什么。

例如,超类型类 Contact 与子类型类 Client 和子类型类供应商。此处显示的方式有效,但是当您编辑联系人时,您会同时获得内联,即子类型 Client 和子类型 Supplier。

因此,即使您只想添加一个客户,您也可以获得供应商的字段,反之亦然。如果添加第三个子类型,您将获得三个子类型字段组,而实际上您只需要一个子类型组,在上述示例中:客户端。

例如:

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

class Client(models.Model):
    contact = models.OneToOneField(Contact, primary_key=True)
    user_name = models.CharField(max_length=128)

class Supplier(models.Model):
    contact.OneToOneField(Contact, primary_key=True)
    company_name = models.CharField(max_length=128)

在 admin.py 中

class ClientInline(admin.StackedInline):
    model = Client

class SupplierInline(admin.StackedInline):
    model = Supplier

class ContactAdmin(admin.ModelAdmin):
    inlines = (ClientInline, SupplierInline,)

class ClientAdmin(admin.ModelAdmin):
    ...

class SupplierAdmin(admin.ModelAdmin):
    ...

现在,当我想添加一个客户时,即只有一个客户,我编辑了联系人,我得到了客户和供应商的内联。供应商当然也一样。

有没有办法避免这种情况?当我想添加/编辑只看到客户内联的客户时,以及当我想添加/编辑只看到供应商内联的供应商时,在添加/编辑联系人时?

或者也许有不同的方法。任何帮助或建议将不胜感激。

【问题讨论】:

    标签: django django-admin inlines


    【解决方案1】:

    如果不是使用一对一的外键来联系你,而是从它继承来的呢?

    class Contact(models.Model):
        contact_name = models.CharField(max_length=128)
    
        class Meta:
            abstract=True # Don't use this line if you want Contact to have its own table
    
    class Client(Contact):
        user_name = models.CharField(max_length=128)
    
    class Supplier(Contact):
        company_name = models.CharField(max_length=128)
    

    然后您可以注册客户和供应商,他们将共享联系人中的字段,但仍将彼此分开。

    【讨论】:

    • 感谢您的回复。从 Django 的角度来看,这至少是一个解决方案。然而,数据库将从根本上有所不同。但目前您的建议是最快的解决方案。
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2014-08-10
    • 1970-01-01
    • 2018-11-27
    • 2018-08-05
    相关资源
    最近更新 更多