Как составить список пользователей, оставивших отзыв о конкретном продукте?

Я создал форму обратной связи. Теперь я хочу сделать список пользователей, которые оставили отзыв о конкретном продукте. Мой мотив в том, что если какой-либо пользователь оставит отзыв о конкретном продукте, он/она не сможет оставить другой отзыв о данном продукте и не сможет увидеть форму обратной связи. Пользователь может оставить только один отзыв на один продукт. Но он/она сможет оставлять отзывы на другие продукты. Как я могу сделать список пользователей, которые оставили отзывы о конкретном продукте? Помогите...

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 the User model [Django-doc] directly. For more information you can see the referencing the User 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 the related_name of a ForeignKey or ManyToManyField is plural, for example reviews instead of productREVIEWrelatedNAME.

Вернуться на верх