unique_together 的 Django 多态模型

Django polymorphic models with unique_together

假设我有这些基本模型:

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'

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

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

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

  1. 将任何涉及唯一约束的父模型字段复制到子模型的table,并表达对子模型字段和从父模型复制的字段的唯一约束,或
  2. 在子视图上创建一个包含父字段和子字段的视图,并表达对该视图的唯一约束。

您将不得不手动执行此操作,或者自动为 inserting/altering/deleting 这些约束开发您自己的框架。