不继承约束的Django模型抽象模型:';约束条件';指字段';xxx和x27;这不是模型';Foo';

不继承约束的Django模型抽象模型:';约束条件';指字段';xxx和x27;这不是模型';Foo';,django,django-models,django-orm,django-migrations,Django,Django Models,Django Orm,Django Migrations,我正在使用Django3.2 我遇到了一个奇怪的行为,这似乎是一个错误;子类不会继承ABC中定义的约束中使用的字段 myapp/models.py 当我makemigrations时没有问题,但是当我尝试迁移模式(`python manage.py migrate)时,我得到以下错误: myapp.Foo:(models.E016)“约束”指的是字段“content\u object”,它不是模型“Foo”的本地字段。 提示:此问题可能是由多表继承引起的 为什么Foo没有继承父ABC中明确定义的

我正在使用Django3.2

我遇到了一个奇怪的行为,这似乎是一个错误;子类不会继承ABC中定义的约束中使用的字段

myapp/models.py 当我
makemigrations
时没有问题,但是当我尝试迁移模式(`python manage.py migrate)时,我得到以下错误:

myapp.Foo:(models.E016)“约束”指的是字段“content\u object”,它不是模型“Foo”的本地字段。 提示:此问题可能是由多表继承引起的


为什么Foo没有继承父ABC中明确定义的字段我如何解决这个问题(假设它不是一个bug)?

1.您不能在
UniqueConstraint
中使用,因为a不是一个普通的字段对象。相反,在
UniqueConstraint
中使用
,这相当于
content\u object


class Meta:
    abstract = True
    constraints = [
        models.UniqueConstraint(
            fields=['content_type', 'object_id', 'user'], 
            name="%(app_label)s_%(class)s_user_unique"),
    ]
如果使用的是相关\u名称相关\u查询\u名称 ForeignKeyManyToManyField,必须始终为字段指定唯一的反向名称和查询名称。这通常会 导致抽象基类出现问题,因为 类包含在每个子类中,并且 属性值相同(包括相关的\u name每次相关的\u查询\u名称

要解决此问题,请在使用相关\u名称时相关的\u查询\u名称在抽象基类中(仅限),是值的一部分 应包含“%(应用程序标签)s”和“%(类)s


谢谢你的回答,但是你自己试过吗?这对错误没有影响。在对代码进行了建议的更改后,我仍然有相同的错误。@HomunculusReticulli,刚刚测试过。错误来自于您的
唯一约束
content\u对象
不是实列。改为使用:
models.UniqueConstraint(字段=['content\u type','object\u id','user'],name=“%(应用程序标签)s\u%(类)s\u user\u unique”),
。我编辑了我的答案。

class Meta:
    abstract = True
    constraints = [
        models.UniqueConstraint(
            fields=['content_type', 'object_id', 'user'], 
            name="%(app_label)s_%(class)s_user_unique"),
    ]
content_type = models.ForeignKey(
   ContentType, on_delete=models.CASCADE,
   related_name='%(app_label)s_%(class)s_content_types',
   related_query_name='%(app_label)s_%(class)s_content_type',
)

user = models.ForeignKey(
    User, blank=False, null=False,
    on_delete=models.CASCADE,
    related_name='%(app_label)s_%(class)s_users',
    related_query_name='%(app_label)s_%(class)s_user',
)