【问题标题】:Django rest framework serializer return a list instead of jsonDjango rest 框架序列化程序返回一个列表而不是 json
【发布时间】:2024-05-18 23:05:02
【问题描述】:

我有以下标签并以多对多的关系发布对象。我尝试在后序列化程序中返回的是返回列表中的标签(仅使用 Tag.name)而不是 json,这样做的干净方法是什么?

serializers.py

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = ('name', 'description', 'date_created', 'created_by')

class PostSerializer(serializers.ModelSerializer):
    tags = TagSerializer(read_only=True, many=True)

    class Meta:
        model = Post
        fields = ('post_id',
                  'post_link',
                  'tags')

目前,PostSerializer 以 json 格式返回所有字段的标签,我只希望它在字符串列表中返回标签:['tag1', 'tag2', 'tag3']。

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    对你来说一个非常简单的解决方案可能是改变它

    tags = TagSerializer(read_only=True, many=True)
    

    进入这个

    tags = TagSerializer(read_only=True, many=True).data
    

    这会将您的标签列为 id,而不是列出每个标签的所有属性

    【讨论】:

      【解决方案2】:

      一种方法是:

      class PostSerializer(serializers.ModelSerializer): 
          tags = serializers.SerializerMethodField()
      
          class Meta:
              model = Post
              fields = ('post_id', 'post_link', 'tags')
      
          def get_tags(self, post):
              return post.tags.values_list('name', flat=True)
      

      第二种方法是使用 Post 模型上的属性:

      class Post(models.Model):
          ....
      
          @property
          def tag_names(self):
              return self.tags.values_list('name', flat=True)
      
      
      class PostSerializer(serializers.ModelSerializer): 
          tag_names = serializers.ReadOnlyField()
      
          class Meta:
              model = Post
              fields = ('post_id', 'post_link', 'tag_names')
      

      【讨论】: