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 中的字段组合表达数据库强制执行的唯一约束.
如果您真的希望数据库对这些字段强制执行唯一约束,您可以执行以下两项操作之一:
- 将任何涉及唯一约束的父模型字段复制到子模型的table,并表达对子模型字段和从父模型复制的字段的唯一约束,或
- 在子视图上创建一个包含父字段和子字段的视图,并表达对该视图的唯一约束。
您将不得不手动执行此操作,或者自动为 inserting/altering/deleting 这些约束开发您自己的框架。
假设我有这些基本模型:
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 中的字段组合表达数据库强制执行的唯一约束.
如果您真的希望数据库对这些字段强制执行唯一约束,您可以执行以下两项操作之一:
- 将任何涉及唯一约束的父模型字段复制到子模型的table,并表达对子模型字段和从父模型复制的字段的唯一约束,或
- 在子视图上创建一个包含父字段和子字段的视图,并表达对该视图的唯一约束。
您将不得不手动执行此操作,或者自动为 inserting/altering/deleting 这些约束开发您自己的框架。