Roitko
Roitko

Reputation: 127

Django models: Unique values for foreign keys

I am building an Instagram like app and trying to make a like model. Each user can like a post however, it should not be possible to like the same post twice.

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

This is my model however, I am able to create 2 identical objects. For example user 1 can have 2 like objects like to post 1.

Is there a way to do this?

Upvotes: 1

Views: 325

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476594

Yes, you can mark the combination of the user and post field as unique with a UniqueConstraint [Django-doc]:

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'post'], name='like_once')
        ]

Prior to , you can make use of the unique_together option [Django-doc]:

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = [['user', 'post']]

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

Upvotes: 3

Related Questions