django - 如何在 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'
解决方案
在这种情况下,最好保持您的数据库标准化,这意味着您不能拥有一个包含许多字段的字段(标准化规则 2)。基于 Rest 范式,您可以将评论作为另一个子应用程序进行评论,该子应用程序由其自己的 url(例如 localhost:8000/comments)引用,这将由前端使用,SPA 将在一个站点中向用户显示该产品带有评论部分的部分将自动反转为后端的产品模型
长话短说:两个独立的应用程序一起通信。
注意:这种方式存储也可以帮助您进行数据工程和数据收集,它优化了抓取、存储和清理的过程。
推荐阅读
- ruby-on-rails - Rspec - 如何关闭系统规范上的当前浏览器?
- javascript - 使用 gatsby-plugin-intl 调整 slug / 路由
- php - 如果键 [any][0] 是相同的数字,则合并/组合(不确定我需要哪个?)php数组
- android - 如何在http帖子正文中将图像作为“文件”发送
- flutter - 任务“:cloud_firestore:compileDebugJavaWithJavac”执行失败
- c++ - 如何通过指向成员数据的指针调用成员函数?
- firebase - 我必须向 Firebase 使用的 API 密钥授予哪些 Google Cloud API 权限?
- regex - 通过正则表达式从 img htmk 标签中提取图像源链接
- java - 如何创建kafka监听器并在spring上下文中动态添加它们
- javascript - 如何在 chrome 扩展中添加额外的 javascript