具有unique_together的Django多态模型

时间:2015-03-01 22:27:31

标签: django django-models

假设我有这些基本模型:

class Trackable(PolymorphicModel):
    uuid = UUIDField(unique=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

儿童模特扩展了它:

class Like(Trackable):
    content = models.ForeignKey(Content, related_name='likes')

    class Meta:
        unique_together = ['content', 'created_by']

当我运行迁移时,它抱怨:

django.db.models.fields.FieldDoesNotExist: Like has no field named u'created_by'

1 个答案:

答案 0 :(得分:2)

以下是我处理此问题的方法。请记住,我使用PostGres作为我的数据库,我不知道其他数据库是否会出现同样的问题(虽然我猜他们会这样做)。

唯一一起约束只能应用于PostGres中的单个表或视图。这意味着开箱即用的Django / Django-polymorphic无法对继承层次结构中父表和Django模型的子表中的字段组合表示数据库强制的唯一约束。

如果您确实希望数据库强制执行这些字段的唯一约束,您可以执行以下两项操作之一:

  1. 将唯一约束中涉及的任何父模型字段复制到子表中,并对子字段和从父项复制的字段表达唯一约束,或
  2. 在子项上创建一个视图,其中包括父项中的字段和子项中的字段,并在此视图中表达唯一约束。
  3. 您必须手动执行此操作,或者开发自己的框架以自动插入/更改/删除这些约束。