Как решить проблему django.db.utils.IntegrityError: UNIQUE constraint failed?

Как решить проблему django.db.utils.IntegrityError: UNIQUE constraint failed? код ошибки django.db.utils.IntegrityError: UNIQUE constraint failed: Movies_comment.user_id, Movies_comment.tv_or_movie_id.

Возникла ошибка Comment(comment=form.clean_data["comment"],user=request.user,stars=form.clean_data["stars"],tv_or_movie=tv_or_movie_object).save()

views.py

def view_tv_and_movie_detail(request, type_movie_or_tv, id):
    tv_or_movie_object, _ = TVAndMovie.objects.get_or_create(tmdb_id=id, judge_tv_or_movie=type_movie_or_tv)
    detail_tv_or_movie = TvAndMovieDetailhelp(request, tv_or_movie_object, 3)
    mycomment_obj = detail_tv_or_movie.get_user_post_comment_for_tv_or_movie()
    if request.method == "POST":
        if request.POST.get("action") == "delete":
            mycomment_obj.delete()
            return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
        else:
            form = CommentCreateForm(request.POST, instance=mycomment_obj)
            if form.is_valid() and request.POST.get("action") == "update":
                form.save()
                return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
            elif form.is_valid() and request.POST.get("action") == "create":
                Comment(
                    comment=form.cleaned_data["comment"],
                    user=request.user,
                    stars=form.cleaned_data["stars"],
                    tv_or_movie=tv_or_movie_object,
                ).save()
                return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
    else:
        form = CommentCreateForm(instance=mycomment_obj)
    data = detail_tv_or_movie.get_object_tv_or_movie_data()
    recommendations = detail_tv_or_movie.get_recommendations_tmdb_data()
    pages = detail_tv_or_movie.get_page_comment()
    average = tv_or_movie_object.average_stars()
    context = {
        "data": data,
        "recommendations": recommendations,
        "type": "movie",
        "mycomment": mycomment_obj,
        "average": average,
        "form": form,
        "pages": pages
    }
    return render(request, "Movie/movie_detail.html", context)

models.py

class TVAndMovie(models.Model):
    tmdb_id = models.CharField(
        validators=[alphanumeric], max_length=9999
    )
    judge_tv_or_movie = models.CharField(
        blank=False, null=False, default="movie", max_length=20
    )
    stars = models.FloatField(
        blank=False,
        null=False,
        default=0,
        validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
    )

    def get_judge_tv_or_movie(self) -> str:
        return self.judge_tv_or_movie

    def get_comments(self) -> object:
        return Comment.objects.prefetch_related("tv_or_movie").filter(
            tv_or_movie_id=self.id
        )

    def average_stars(self) -> float:
        comments = self.get_comments()
        n_comments = comments.count()

        if n_comments:
            self.stars = round(
                sum([comment.stars for comment in comments]) / n_comments, 3
            )
        else:
            self.stars = 0
        self.save()
        return self.stars


class Comment(models.Model):

    comment = models.TextField(max_length=1000)
    stars = models.FloatField(
        blank=False,
        null=False,
        default=0,
        validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
    )
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    tv_or_movie = models.ForeignKey(TVAndMovie, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    
    class Meta:
        unique_together = ("user", "tv_or_movie")
        indexes = [models.Index(fields=["user", "tv_or_movie"])]
        
    def __str__(self) -> str:
        return self.comment[:20]

helper_views.py

tv_or_movie перед сохранением, т.е.

if not Comment.objects.filter(user=request.user, tv_or_movie=tv_or_movie_object).exists()
    Comment(comment=form.cleaned_data["comment"], user=request.user, stars=form.cleaned_data["stars"], tv_or_movie=tv_or_movie_object).save()
Вернуться на верх