多级评论问题记录(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都需要做一次数据库查询,效率比较低

参考自:自关联表的序列化技巧-CSDN博客

该问题的解决方案待更新

 

posted @ 2025-05-25 01:10  YoungS01  阅读(11)  评论(0)    收藏  举报