django - 将ForeignKey用于抽象类有哪些替代方法?

时间:2015-05-30 20:29:28

标签: python django django-models

我希望在Django中有一个抽象的Company模型,并根据所涉公司的类型对其进行扩展:

class Company(models.Model):
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)

    class Meta:
        abstract = True

class Buyer(Company):
    # Buyer fields..
    pass

class Seller(Company):
    # Seller fields...
    pass

系统上的每个用户都与公司关联,因此我想将以下内容添加到用户个人资料中:

company = models.ForeignKey('Company')

但是这给出了可怕的错误:

  

main.Profile.company:(fields.E300)字段定义与之的关系   model' Company',未安装或抽象。

所以我想象我想做的事情是无法完成的。我看到contenttypes框架可用于此目的,如this问题所述。我的问题是,我不希望company字段指向任何模型,而只是Company模型的子类。

还有什么我可以用于此目的吗?

1 个答案:

答案 0 :(得分:2)

ForeignKey无法直接引用抽象模型的原因是从抽象模型继承的单个模型实际上在数据库中有自己的表。

外键只是引用相关表中id的整数,因此如果外键与抽象模型相关,则会产生歧义。例如,可能存在BuyerSeller实例,每个实例的id为1,管理员不知道要加载哪个实例。

使用a fix还可以通过记住你在关系中谈论的模型来解决这个问题。

它不需要任何其他模型,只需使用一个额外的列。

示例 -

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey

class Foo(models.Model):
  company_type = models.ForeignKey(ContentType)
  company_id = models.PositiveIntegerField()
  company = GenericForeignKey('company_type', 'company_id')

然后 -

>>> seller = Seller.objects.create()
>>> buyer = Buyer.objects.create()
>>> 
>>> foo1 = Foo.objects.create(company = seller) 
>>> foo2 = Foo.objects.create(company = buyer) 
>>> 
>>> foo1.company 
<Seller: Seller object>
>>> foo2.company 
<Buyer: Buyer object>