How do I solve django.db.utils.IntegrityError: UNIQUE constraint failed? error code is django.db.utils.IntegrityError: UNIQUE constraint failed: Movies_comment.user_id, Movies_comment.tv_or_movie_id.
This error occurs Comment(comment=form.cleaned_data[“comment”],user=request.user,stars=form.cleaned_data[“stars”],tv_or_movie=tv_or_movie_object).save()
views.py
JavaScript
x
38
38
1
def view_tv_and_movie_detail(request, type_movie_or_tv, id):
2
tv_or_movie_object, _ = TVAndMovie.objects.get_or_create(tmdb_id=id, judge_tv_or_movie=type_movie_or_tv)
3
detail_tv_or_movie = TvAndMovieDetailhelp(request, tv_or_movie_object, 3)
4
mycomment_obj = detail_tv_or_movie.get_user_post_comment_for_tv_or_movie()
5
if request.method == "POST":
6
if request.POST.get("action") == "delete":
7
mycomment_obj.delete()
8
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
9
else:
10
form = CommentCreateForm(request.POST, instance=mycomment_obj)
11
if form.is_valid() and request.POST.get("action") == "update":
12
form.save()
13
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
14
elif form.is_valid() and request.POST.get("action") == "create":
15
Comment(
16
comment=form.cleaned_data["comment"],
17
user=request.user,
18
stars=form.cleaned_data["stars"],
19
tv_or_movie=tv_or_movie_object,
20
).save()
21
return redirect("view_tv_and_movie_detail", type=type_movie_or_tv, id=id)
22
else:
23
form = CommentCreateForm(instance=mycomment_obj)
24
data = detail_tv_or_movie.get_object_tv_or_movie_data()
25
recommendations = detail_tv_or_movie.get_recommendations_tmdb_data()
26
pages = detail_tv_or_movie.get_page_comment()
27
average = tv_or_movie_object.average_stars()
28
context = {
29
"data": data,
30
"recommendations": recommendations,
31
"type": "movie",
32
"mycomment": mycomment_obj,
33
"average": average,
34
"form": form,
35
"pages": pages
36
}
37
return render(request, "Movie/movie_detail.html", context)
38
models.py
JavaScript
1
58
58
1
class TVAndMovie(models.Model):
2
tmdb_id = models.CharField(
3
validators=[alphanumeric], max_length=9999
4
)
5
judge_tv_or_movie = models.CharField(
6
blank=False, null=False, default="movie", max_length=20
7
)
8
stars = models.FloatField(
9
blank=False,
10
null=False,
11
default=0,
12
validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
13
)
14
15
def get_judge_tv_or_movie(self) -> str:
16
return self.judge_tv_or_movie
17
18
def get_comments(self) -> object:
19
return Comment.objects.prefetch_related("tv_or_movie").filter(
20
tv_or_movie_id=self.id
21
)
22
23
def average_stars(self) -> float:
24
comments = self.get_comments()
25
n_comments = comments.count()
26
27
if n_comments:
28
self.stars = round(
29
sum([comment.stars for comment in comments]) / n_comments, 3
30
)
31
else:
32
self.stars = 0
33
self.save()
34
return self.stars
35
36
37
class Comment(models.Model):
38
39
comment = models.TextField(max_length=1000)
40
stars = models.FloatField(
41
blank=False,
42
null=False,
43
default=0,
44
validators=[MinValueValidator(0.0), MaxValueValidator(10.0)],
45
)
46
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
47
tv_or_movie = models.ForeignKey(TVAndMovie, on_delete=models.CASCADE)
48
created_at = models.DateTimeField(auto_now_add=True)
49
updated_at = models.DateTimeField(auto_now=True)
50
51
class Meta:
52
unique_together = ("user", "tv_or_movie")
53
indexes = [models.Index(fields=["user", "tv_or_movie"])]
54
55
def __str__(self) -> str:
56
return self.comment[:20]
57
58
helper_views.py
JavaScript
1
84
84
1
class TvAndMovieDetailhelp:
2
def __init__(self, request, obj_tv_or_movie: object, page_num: int) -> None:
3
self.request = request
4
self.obj_tv_or_movie: object = obj_tv_or_movie
5
self.page_num: int = page_num
6
7
def get_object_tv_or_movie_data(self) -> dict:
8
tv_or_movie_url: str = (
9
"https://api.themoviedb.org/3/" +
10
self.obj_tv_or_movie.judge_tv_or_movie +
11
"/" +
12
str(self.obj_tv_or_movie.tmdb_id) +
13
"?api_key=" +
14
TMDB_API_KEY +
15
"&language=en-US"
16
)
17
return (requests.get(tv_or_movie_url)).json()
18
19
def get_recommendations_tmdb_data(self) -> dict:
20
recommendations_url: str = (
21
"https://api.themoviedb.org/3/" +
22
self.obj_tv_or_movie.judge_tv_or_movie +
23
"/" +
24
str(self.obj_tv_or_movie.tmdb_id) +
25
"/recommendations?api_key=" +
26
TMDB_API_KEY +
27
"&language=en-US"
28
)
29
return (requests.get(recommendations_url)).json()
30
31
def get_comment_for_tv_or_movie(self) -> object:
32
if self.request.user.id is not None:
33
return (
34
Comment.objects.filter(tv_or_movie=self.obj_tv_or_movie.id)
35
.exclude(user=self.request.user)
36
.order_by("-updated_at")
37
)
38
else:
39
return Comment.objects.filter(tv_or_movie=self.obj_tv_or_movie.id).order_by(
40
"-updated_at"
41
)
42
43
def get_user_post_comment_for_tv_or_movie(self) -> object:
44
if self.request.user.id is not None:
45
try:
46
return Comment.objects.get(
47
user=self.request.user, tv_or_movie=self.obj_tv_or_movie
48
)
49
except Comment.DoesNotExist:
50
return None
51
else:
52
return None
53
54
def get_page_comment(self):
55
other_comments = self.get_comment_for_tv_or_movie()
56
paginator = Paginator(other_comments, self.page_num)
57
page = self.request.GET.get("page", 1)
58
try:
59
pages = paginator.page(page)
60
except PageNotAnInteger:
61
pages = paginator.page(1)
62
except EmptyPage:
63
pages = paginator.page(1)
64
return pages
65
66
def send_contexts_detail(self,form) -> dict:
67
data_for_tvor_movie = self.get_object_tv_or_movie_data()
68
recommendations_data = self.get_recommendations_tmdb_data()
69
for_movie_or_tv = self.obj_tv_or_movie.judge_tv_or_movie
70
mycomment_obj = self.get_user_post_comment_for_tv_or_movie()
71
average = self.obj_tv_or_movie.getaverage_stars()
72
pages = self.get_page_comment()
73
context = {
74
"data": data_for_tvor_movie,
75
"recommendations": recommendations_data,
76
"type": for_movie_or_tv,
77
"mycomment": mycomment_obj,
78
"average": average,
79
"form": form,
80
"pages": pages, # NOTE add the comment to context
81
}
82
return context
83
84
Advertisement
Answer
tv_or_movie before saving i.e.
JavaScript
1
3
1
if not Comment.objects.filter(user=request.user, tv_or_movie=tv_or_movie_object).exists()
2
Comment(comment=form.cleaned_data["comment"], user=request.user, stars=form.cleaned_data["stars"], tv_or_movie=tv_or_movie_object).save()
3