python - Django中抽象模型相关的ForeignKey字段

标签 python django foreign-keys abstract

我有这个模型:

class BaseModel(models.Model):
    ....

    class Meta:
        abstract = True


class ModelA(BaseModel):
    ....

class ModelB(BaseModel):
    ....


class MyExtModel(models.Model)
    myfield = models.ForeignKey(BaseModel)

但这是不正确的,因为我有像 Abstract 这样的 BaseModel。事实上,当我尝试 makemigration 命令时出现错误。

错误是:

ERRORS:
myapp.MyExtModel.myfield: (fields.E300) Field defines a relation with model 'BaseModel', which is either not installed, or is abstract.

有没有办法使用抽象基础模型?

我也尝试过使用:

myfield = models.ForeignKey(BaseModel, related_name="%(app_label)s_%(class)s_related")

最佳答案

在 Django 中无法将外键安装到抽象模型中。 但是,您可以将外键安装到非抽象基类。唯一的限制是反向外键关系将返回基类实例。 您可以使用 django-polymorphic 来规避此限制。 .

Django Polymorphic 允许您查询基类对象但检索子类实例:

>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

>>> Project.objects.all()
[ <Project:         id 1, topic "Department Party">,
  <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
  <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

要使用 Django 多态性,您只需将多态模型声明为基类:

from django.db import models
from polymorphic.models import PolymorphicModel

class ModelA(PolymorphicModel):
    field1 = models.CharField(max_length=10)

class ModelB(ModelA):
    field2 = models.CharField(max_length=10)

class ModelC(ModelB):
    field3 = models.CharField(max_length=10)

外键也将返回子类实例,我假设这是您需要的:

# The model holding the relation may be any kind of model, polymorphic or not
class RelatingModel(models.Model):
    many2many = models.ManyToManyField('ModelA')  # ManyToMany relation to a polymorphic model

>>> o=RelatingModel.objects.create()
>>> o.many2many.add(ModelA.objects.get(id=1))
>>> o.many2many.add(ModelB.objects.get(id=2))
>>> o.many2many.add(ModelC.objects.get(id=3))

>>> o.many2many.all()
[ <ModelA: id 1, field1 (CharField)>,
  <ModelB: id 2, field1 (CharField), field2 (CharField)>,
  <ModelC: id 3, field1 (CharField), field2 (CharField), field3 (CharField)> ]

考虑到这些查询将是 slightly less performant .

关于python - Django中抽象模型相关的ForeignKey字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30343212/

相关文章:

python - 部分展平列表

python - 为什么设置默认参数然后在python中运行if语句?

python - 如何使用 PyCharm 3.1.1 中的项目需求文件升级包版本

mysql - 如何创建一个具有非唯一ID的表并将其作为另一个表中的外键?

regex - 如何使用存储在字段值中的正则表达式执行正则表达式查找?

插入 580 行后,MySQL 表插入错误因外键错误而失败

python - 如何使用 reStructuredText/Sphinx 插入空白行

python - Django rest 框架使用 user.id 自动填充字段

sql - 为什么外键必须只与主键相关?

mysql - 在一张表中添加第二个外键 - MySql