2010-03-15 68 views
1

什么是添加/编辑多个子类型的最佳解决方案。如何处理Django中一个超类型的多个子类型admin

例如一个超类型的类联系子类型的类客户端和子类型的类供应商。这里显示的方式有效,但编辑联系人时,您可以同时获得内联,即子类型“客户”和“子类型”供应商。

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

如:

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): 
    ... 

现在,当我想添加一个客户端,即只有一个客户我的编辑联系,我得到了行内为客户端和供应商。当然对于供应商也是如此。

有没有办法避免这种情况?当我想添加/编辑客户端时,我只能看到Inline for Client,并且当我想添加/编辑一个供应商时,只有添加/编辑联系人时才会看到供应商的内联?

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

回答

0

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

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) 

然后,你可以注册客户和供应商,他们将分享联系人等领域,但仍然是相互独立的。

+0

感谢您的回复。从Django的角度来看,这可能是一个解决方案。但数据库将会有根本的不同。但现在你的建议是最快的解决方案。 – Henri 2010-03-15 15:03:01

相关问题