过滤嵌套的序列化器模型字段(排除特定字段)

问题描述 投票:0回答:2

我是

Django
的新手,我正在尝试
exclude
嵌套序列化程序中的模型字段。

模态.py

class Blog(models.Model):
    title = models.CharField(max_length=30)
    description = models.CharField(max_length=30)

class Comment(models.Model):
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE, related_name="comment")
    comment_bdy = models.CharField(max_length=30)
    completed = models.BooleanField(default=False)

序列化程序.py

class BlogCommentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Comment
        fields = ("id", "comment_body")

class BlogSerializer(serializers.ModelSerializer):
    comment = BlogCommentSerializer(many=True)
    
    class Meta:
        model = ("id", "title", "description", "comment",)

我试图排除

comment
completed=True
.

我已经尝试过很多次了:-

class BlogCommentSerializer(serializers.ModelSerializer):

    def to_representation(self, data):
        data = data.filter(completed=False)
        return super(BlogCommentSerializer, self).to_representation(data)

但它显示:

AttributeError: 'CommentReply' 对象没有属性 'filter'

然后我尝试使用:

class BlogSerializer(serializers.ModelSerializer):

    def get_comment(self, instance):
        comment_instance = instance.comment_set.exclude(completed=True)
        return BlogSerializer(comment_instance , many=True).data

也没用。

我想做什么

我试图排除

completed=True
.

的评论
python django django-models django-rest-framework django-serializer
2个回答
1
投票

你可以这样尝试使用

SerializerMethodField

class BlogSerializer(serializers.ModelSerializer):
    comment = serializers.SerializerMethodField()

    def get_comment(self, instance):
        comment_instances = instance.comment.exclude(completed=True)
        return BlogCommentSerializer(comment_instances , many=True).data

0
投票

试试这个:

class BlogSerializer(serializers.ModelSerializer):
    comment = serializers.SerializerMethodField()

    def get_comment(self, obj):
        queryset = Comment.objects.
            filter(blog=obj).exclude(blog__completed=True)
        return [BlogCommentSerializer(q).data for q in queryset]
© www.soinside.com 2019 - 2024. All rights reserved.