Как составить список пользователей, оставивших отзыв о конкретном продукте?
Я создал форму обратной связи. Теперь я хочу сделать список пользователей, которые оставили отзыв о конкретном продукте. Мой мотив в том, что если какой-либо пользователь оставит отзыв о конкретном продукте, он/она не сможет оставить другой отзыв о данном продукте и не сможет увидеть форму обратной связи. Пользователь может оставить только один отзыв на один продукт. Но он/она сможет оставлять отзывы на другие продукты. Как я могу сделать список пользователей, которые оставили отзывы о конкретном продукте? Помогите...
models.py:
class Products(models.Model):
user = models.ForeignKey(User, related_name="merchandise_product_related_name", on_delete=models.CASCADE, blank=True, null=True)
product_title = models.CharField(blank=True, null=True, max_length = 250)
on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return str(self.pk) + "." + str(self.product_title)
class ProductREVIEWS(models.Model):
user = models.ForeignKey(User, related_name='userREVIEW',on_delete=models.CASCADE)
product = models.ForeignKey(Products, related_name='productREVIEWrelatedNAME',on_delete=models.CASCADE)
def __str__(self):
return str(self.pk) + "." + str(self.product) + "(" + str(self.user) + ")"
views.py:
def quick_view(request, quick_view_id):
quick_view = get_object_or_404(Products, pk=quick_view_id)
AllProductFeedback = quick_view.productREVIEWrelatedNAME.all()
TotalProductsFeedback = AllProductFeedback.count()
OverallFeedback = ProductREVIEWS.objects.all()
context = {
"quick_view":quick_view,
"TotalProductsFeedback":TotalProductsFeedback,
"AllProductFeedback":AllProductFeedback,
"OverallFeedback":OverallFeedback,
}
return render(request, 'quickVIEW_item.html', context)
Вы можете .filter(…)
[Django-doc] с:
User.objects.filter(userREVIEW__product=quick_view)
Однако вы можете просто позволить базе данных предотвратить создание двух ProductREVIEWS
для одной и той же комбинации user
и product
с помощью UniqueConstraint
[Django-doc]:
from django.conf import settings
class ProductReview(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='reviews',
on_delete=models.CASCADE
)
product = models.ForeignKey(
Product,
related_name='reviews',
on_delete=models.CASCADE
)
class Meta:
constraints = [
models.UniqueConstraint(
fields=('user', 'product'),
name='review_once'
)
]
def __str__(self):
return f'{self.pk}.{self.product}({self.user})'
с измененными именами, это:
User.objects.filter(reviews__product=quick_view)
Но здесь база данных, таким образом, отклонит второй обзор того же продукта тем же пользователем.
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 theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
Примечание: обычно модели Django дается сингулярное имя, поэтому
Product
вместо.Products
Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вProductREVIEWS
ProductReview
.
Note: The
related_name=…
[Django-doc] is the name of the manager to fetch the related objects in reverse. Therefore normally therelated_name
of aForeignKey
orManyToManyField
is plural, for examplereviews
instead of.productREVIEWrelatedNAME