Django 组合在多个模型字段上是唯一的
Django composite unique on multiple model fields
假设我有一个社交网络 posts、用户和喜欢的模型:
class Post(models.Model):
submitter = models.ForeignKey(User, null=False, default=None)
content = models.CharField()
date = models.DateField()
with_likes = PostLikeCountManager()
objects = models.Manager()
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
将 Post
模型视为代表 Facebook
post 会很有帮助。现在,我想限制每个用户每个 post 一个。我该如何实现?一种方法是在 Like
class 的 (user
, post
) 属性上创建复合主键。我不知道如何在 Django 中实现这一目标。另一种是同时对两个属性使用 unique=True
。这可能吗?
谢谢。
是的,使用 unique_together:
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'post')
unique_together
将在未来版本中弃用,您可以应用 UniqueConstraint
。 This and this link 给出示例代码。
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['user', 'post'], name='unique_user_post'),
]
假设我有一个社交网络 posts、用户和喜欢的模型:
class Post(models.Model):
submitter = models.ForeignKey(User, null=False, default=None)
content = models.CharField()
date = models.DateField()
with_likes = PostLikeCountManager()
objects = models.Manager()
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
将 Post
模型视为代表 Facebook
post 会很有帮助。现在,我想限制每个用户每个 post 一个。我该如何实现?一种方法是在 Like
class 的 (user
, post
) 属性上创建复合主键。我不知道如何在 Django 中实现这一目标。另一种是同时对两个属性使用 unique=True
。这可能吗?
谢谢。
是的,使用 unique_together:
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('user', 'post')
unique_together
将在未来版本中弃用,您可以应用 UniqueConstraint
。 This and this link 给出示例代码。
class Like(models.Model):
user = models.ForeignKey(User)
post = models.ForeignKey(Post)
time = models.DateTimeField(auto_now_add=True)
class Meta:
constraints = [
models.UniqueConstraint(fields=['user', 'post'], name='unique_user_post'),
]