首页 > 解决方案 > 如何在 Django rest 框架中为嵌套评论创建视图?

问题描述

我想为我的项目有一个嵌套的评论系统。我有产品模型,所以我希望客户可以评论我的产品。我有我的产品和评论模型和序列化程序,并且我在产品序列化程序中与产品相关的评论,以便我可以显示产品评论。我应该怎么做客户可以写他们对产品的评论???评论必须嵌套。这是我的代码:

#楷模

class Comment(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='comments')
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True,blank=True, related_name='replys')
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f'{self.user} - {self.body[:30]}'

    class Meta:
        ordering = ('-created',)

#序列化器:

class CommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Comment
        fields = ['id', 'user', 'product', 'parent', 'body', 'created']


class ProductSerializer(serializers.ModelSerializer):
    comments = CommentSerializer(many=True, read_only=True)

    class Meta:
        model = Product
        fields = ['id', 'category', 'name', 'slug', 'image_1',
                  'image_2', 'image_3', 'image_4', 'image_5',
                  'description', 'price', 'available', 'created', 'updated', 'comments']
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

#观看次数:

class Home(generics.ListAPIView):
    queryset = Product.objects.filter(available=True)
    serializer_class = ProductSerializer
    permission_classes = (permissions.AllowAny,)
    filter_backends = [filters.SearchFilter]
    search_fields = ['name', 'category__name', 'description']



class RetrieveProductView(generics.RetrieveAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    permission_classes = (permissions.AllowAny,)
    lookup_field = 'slug'

标签: djangodjango-rest-frameworkdjango-views

解决方案


在这种情况下,最好保持您的数据库标准化,这意味着您不能拥有一个包含许多字段的字段(标准化规则 2)。基于 Rest 范式,您可以将评论作为另一个子应用程序进行评论,该子应用程序由其自己的 url(例如 localhost:8000/comments)引用,这将由前端使用,SPA 将在一个站点中向用户显示该产品带有评论部分的部分将自动反转为后端的产品模型

长话短说:两个独立的应用程序一起通信。

注意:这种方式存储也可以帮助您进行数据工程和数据收集,它优化了抓取、存储和清理的过程。


推荐阅读