Django复合在多个模型字段上是唯一的

时间:2015-04-05 20:29:49

标签: django django-models

让我们说我有社交网络帖子,用户和喜欢的模型:

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帖子会很有帮助。现在,我想限制每个用户每个帖子一个。我如何实现这一目标?一种方法是在user类的postLike)属性上创建复合主键。我不知道如何在Django中实现这一目标。另一种是同时在两个属性上使用unique=True。这可能吗?

感谢。

2 个答案:

答案 0 :(得分:16)

是的,请使用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')

答案 1 :(得分:3)

unique_together将在以后的版本中弃用,您可以应用UniqueConstraintThisthis 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'),
        ]