我有这个模型:
class BaseModel(models.Model):
....
class Meta:
abstract = True
class ModelA(BaseModel):
....
class ModelB(BaseModel):
....
class MyExtModel(models.Model)
myfield = models.ForeignKey(BaseModel)
但这是不正确的,因为我有BaseModel
类似的Abstract
。实际上,我在尝试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")
当我遇到这样的情况,我不得不为不同的模型制作外键时,我选择使用
GenericForeignKey
您可以在这里查看官方文档:Django ContentTypes: Generic Relations文档很好地解释了如何使用它:
字段content\u type存储泛型外键指向的模型
字段对象id存储外键的id,
这不是最好的解决方案,但它在一些项目中拯救了我
使用示例:
在Django中不可能为抽象模型安装外键。 但是,您可以将外键安装到非抽象基类。唯一的限制是反向外键关系将返回基类实例。 您可以使用django-polymorphic来绕过此限制。
Django多态允许您查询基类对象,但检索子类实例:
要使用django polymorphic,只需将具有polymorphic Model的模型声明为基类:
外键还将返回子类实例,这是您需要的,我假设:
考虑到这些查询将是slightly less performant。
除了我不太熟悉的
GenericForeignKey
这个很好的答案之外,有时(只是有时,只要可能),通过使用与“基本”模型的一对一关系来简化模型是值得的。使外键管理更容易之后。如果我记得好的话,抽象类上的外键是不可能的。
相关问题 更多 >
编程相关推荐