【问题标题】:How can I make a user list of those who have given feedback on the particular product?如何制作对特定产品提供反馈的用户列表?
【发布时间】:2022-09-28 15:28:25
【问题描述】:

我已经做了一个反馈表。现在我想列出对特定产品提供反馈的用户列表。我的动机是,如果任何用户对特定产品提供反馈,他/她将无法对该特定产品提供其他反馈,也看不到反馈表。一个用户只能分享一个产品的一个反馈。但他/她将能够对其他产品提供反馈。如何制作对特定产品提供反馈的用户列表?

模型.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) + \")\"

视图.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)

    标签: python django django-models django-views


    【解决方案1】:

    您可以.filter(…) [Django-doc] 使用:

    User.objects.filter(<b>userREVIEW__product=quick_view</b>)

    但是,您可以简单地让数据库阻止为相同的userproductUniqueConstraint [Django-doc] 组合创建两个ProductREVIEWS

    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)
    

    但是在这里,数据库将因此拒绝同一用户对同一产品的第二次评论。


    笔记: 通常使用settings.AUTH_USER_MODEL [Django-doc] 来引用用户模型比直接使用User model [Django-doc] 更好。有关更多信息,您可以查看referencing the User model section of the documentation


    笔记: 通常一个 Django 模型被赋予一个单数名称,所以 Product 而不是Products.


    笔记: Django 中的模型是用帕斯卡案例, 不是蛇案例, 所以你可能想重命名模型ProductREVIEWSProductReview


    笔记related_name=… [Django-doc] 是反向获取相关对象的管理器的名称。所以 通常related_nameForeignKeyManyToManyField复数, 例如reviews 而不是productREVIEWrelatedNAME.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多