Django:我放置ForeignKey字段的位置的相关性以及我是否应该使用管理站点

时间:2012-11-16 12:59:02

标签: django django-models django-admin

所以我正在做一个小的django项目,当我尝试将某些模型内联到管理站点时,我遇到了一些问题。例如:

models.py

class Client(models.Model):
    client_name = models.CharField(max_length=100,unique=True,blank=False)
    phone_number = models.ForeignKey(Phone)

class Phone(models.Model):
    info = models.Charfield("eg. Personal", max_length=20)
    number = models.CharField(max_length=20, blank=False)

现在,如果我想让我的客户管理员将phone_number堆叠成内联,我就不能这样做了......而我需要让我的模型像这样:

class Client(models.Model):
    client_name = ...

class PhoneAbstract(models.Model):
    info = ...
    number = ...

    class Meta: 
        abstract = True

class ClientPhone(PhoneAbstract):
    client = models.ForeignKey(Client)

...并且每次我想要将手机与模型联系起来时,基本上定义了一个继承PhoneAbstract的新类:(。这很糟糕,但这是我可以做到这一点并获得正确管理界面的唯一方法:

admin.py

class PhoneInline(admin.TabularInline):
    model = ClientPhone

class ClientAdmin(admin.ModelAdmin):
    inlines = (PhoneInline, )

现在,这很丑陋(对于我尚未受过教育的人来说)并且它使关系变得尴尬......所以,在第一种情况下,有没有办法在我的ClientAdmin中使用外键?也许这就是ModelAdmin.list_select_related的用途,但我不确定...... :(

1 个答案:

答案 0 :(得分:1)

我不知道你为什么要这样定义事物。您希望拥有它的方式,一个电话号码可以属于多个客户端,这似乎不太可能。在PhoneNumber模型上使用ForeignKey字段是正确的做法,因为这种关系是有意义的(客户端可以有多个电话号码)。

但是没有必要使用抽象模型和子类化。如果您需要能够将电话号码指向多个不同的模型类别,那么generic relations就是您所需要的。