Django unique_together против явного ограничения дубликатов

В настоящее время у меня есть этот блок try-except для ограничения дублирования полей user и post в модели Follow model:

def follow(request, post_pk):
    user = request.user
    post = Post.objects.get(id=post_pk)
    try:
        _follow = Follow.objects.get(user=user, post=post)
    except Follow.DoesNotExist:
        _follow = Follow(user=user, post=post)
        _follow.save()
    return redirect(request.META.get("HTTP_REFERER"))

Недавно я узнал об unique_together в классе Meta. Теперь я могу модифицировать модель следующим образом:

class Follow(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)

    class Meta:
        unique_together = (('user', 'post'),)

Сделав это, можно ли убрать явное ограничение на дублирование в try-блоке файла views.py? Тогда код будет выглядеть следующим образом:

def follow(request, post_pk):
    user = request.user
    post = Post.objects.get(id=post_pk)
    _follow = Follow(user=user, post=post)
    _follow.save()
    return redirect(request.META.get("HTTP_REFERER"))

С помощью unique_together вы добавили ограничение в вашу БД.
Если вы выполните _follow.save() и послепользовательский комбо существует в БД, приложение вызовет исключение IntegrityError.

from django.db import IntegrityError

def follow(request, post_pk):
    user = request.user
    post = Post.objects.get(id=post_pk)
    try:
        Follow.objects.create(user=user, post=post)
    except IntegrityError: 
        # do something to manage duplicate? or show error and redirect
    return redirect(request.META.get("HTTP_REFERER"))
Вернуться на верх