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"))