【问题标题】:Queryset is returned inside children key查询集在子键内返回
【发布时间】:2016-08-25 22:32:27
【问题描述】:

我想列出所有评论以及对特定餐厅特定评论的回复,但我只能列出评论。在尝试获取对其特定评论的所有回复时,我调用了评论模型中定义的 children()。它返回查询集。另一方面,我想要所有带有回复者名称的特定回复。

serializers.py

class ReviewSeraializer(ModelSerializer):
    reply_count = SerializerMethodField()
    children = SerializerMethodField()
    class Meta:
        model = Review
        read_only = ('id',) 
        fields = ('id','content_type','object_id','parent','review','children','reply_count','created') 

    def get_reply_count(self, obj):
        if obj.is_parent:
            return obj.children().count()
        return 0

    def get_children(self, obj):
        obj_children = []
        if obj.is_parent:
            return str(obj.children())
            # for obj in obj.children():
            #   print(obj.review)
            #   obj_children.append(obj.review)
            # return str(obj_children)
        return None

review/models.py

class Review(models.Model):
    reviewer = models.ForeignKey(User, null=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    parent = models.ForeignKey("self", null=True, blank=True, related_name="parent_review")
    review = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    objects = ReviewManager()


    def children(self): # replies
        return Review.objects.filter(parent=self)

    @property   
    def is_parent(self):
        if self.parent is not None:
            return False 
        return True 

如何列出特定评论的子键中的所有回复和回复者名称?

【问题讨论】:

    标签: python django python-3.x django-rest-framework


    【解决方案1】:

    添加另一个可以序列化您的孩子的序列化程序。

    class ReviewSeraializerChild(serializers.ModelSerializer):
        class Meta:
            model = Review
    
    
    class ReviewSeraializer(serializers.ModelSerializer):
        reply_count = serializers.SerializerMethodField()
        children = ReviewSeraializerChild(many=True)
    
        class Meta:
            model = Review
            read_only = ('id',)
            fields = ('id', 'content_type', 'object_id', 'parent', 'review', 'children', 'reply_count', 'created')
    
        def get_reply_count(self, obj):
            if obj.is_parent:
                return obj.children().count()
            return 0
    

    但是您必须为嵌套字段 编写自定义的 create() 和 update() 函数。

    【讨论】:

    • 发表评论正在工作,也回复。同样使用 django 模板我可以获取特定评论的回复,但我只有使用 reactjs 和 api 获取特定评论的回复的问题。我现在就试试这个方法。
    • 检查github.com/alanjds/drf-nested-routers。您可以创建嵌套路由,使用 reactJS 管理您的评论 api 会更容易。
    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-22
    • 2021-06-18
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多