多级评论问题记录(DRF)
模型类:
1 class Comment(models.Model): 2 user = models.ForeignKey(User, on_delete=models.CASCADE) 3 post = models.ForeignKey(Post, on_delete=models.CASCADE) 4 content = models.TextField() 5 reviewed = models.BooleanField(default=False) 6 parent = models.ForeignKey('self', null=True, blank=True,related_name='subs', on_delete=models.CASCADE) 7 create_at = models.DateTimeField(auto_now_add=True) 8 update_at = models.DateTimeField(auto_now=True, blank=True)
序列化器:
1 class CommentSerialiser(serializers.ModelSerializer): 2 # subs = serializers.HyperlinkedRelatedField(many=True, read_only=True, view_name='comment-detail') 3 subs = serializers.SerializerMethodField() 4 # post = PostListSerialiser(read_only=True) # 包含对象方式 5 post = serializers.SerializerMethodField() 6 # category_id = serializers.PrimaryKeyRelatedField(read_only=True) # 取的是id 7 post_id = serializers.IntegerField(write_only=True) 8 user = serializers.SerializerMethodField() # 直接取所需要值方式 9 user_id = serializers.IntegerField(write_only=True) 10 parent_id = serializers.IntegerField(write_only=True, allow_null=True) 11 12 13 class Meta: 14 model = Comment 15 fields = ('id', 'user', 'user_id', 16 'post', 'post_id', 'content', 17 'reviewed', 'subs', 'parent_id', 18 'create_at') 19 20 read_only_fields = ('id', 'user', 21 'post', 22 'reviewed', 'subs', 23 'create_at') 24 # extra_kwargs = { 25 # 'content': {'read_only': True, 'write_only': True} 26 # } 27 28 def get_subs(self, obj): 29 if not obj: 30 return None 31 queryset = Comment.objects.filter(parent=obj.id).order_by('id').all() 32 children = CommentSerialiser(queryset, many=True).data 33 if children: 34 return children 35 return None 36 37 def get_post(self, obj): 38 cur_url = '/post/'+ str(obj.post.id)+'/' 39 return cur_url 40 41 42 def get_user(self, obj): 43 # print(obj.user) 44 return obj.user.username
结果展示:
[
{
"id": 1,
"user": "solomon",
"post": "/post/1/",
"content": "11111",
"reviewed": false,
"subs": [
{
"id": 2,
"user": "solomon",
"post": "/post/1/",
"content": "11111 reply",
"reviewed": false,
"subs": [
{
"id": 3,
"user": "solomon",
"post": "/post/1/",
"content": "22 reply",
"reviewed": false,
"subs": null,
"create_at": "2025-05-20T15:27:43.786099Z"
}
],
"create_at": "2025-05-18T12:25:00.848266Z"
},
{
"id": 4,
"user": "Miller",
"post": "/post/1/",
"content": "1111 2rd reply",
"reviewed": false,
"subs": null,
"create_at": "2025-05-24T08:58:24.105663Z"
}
],
"create_at": "2025-05-18T09:02:52.002442Z"
},
{
"id": 2,
"user": "solomon",
"post": "/post/1/",
"content": "11111 reply",
"reviewed": false,
"subs": [
{
"id": 3,
"user": "solomon",
"post": "/post/1/",
"content": "22 reply",
"reviewed": false,
"subs": null,
"create_at": "2025-05-20T15:27:43.786099Z"
}
],
"create_at": "2025-05-18T12:25:00.848266Z"
},
{
"id": 3,
"user": "solomon",
"post": "/post/1/",
"content": "22 reply",
"reviewed": false,
"subs": null,
"create_at": "2025-05-20T15:27:43.786099Z"
},
{
"id": 4,
"user": "Miller",
"post": "/post/1/",
"content": "1111 2rd reply",
"reviewed": false,
"subs": null,
"create_at": "2025-05-24T08:58:24.105663Z"
}
]
此种方式存在问题是:一旦数据量大的话,每条subs都需要做一次数据库查询,效率比较低
该问题的解决方案待更新

浙公网安备 33010602011771号