过滤序列化器响应数据

时间:2016-09-04 20:04:04

标签: python django django-rest-framework

我与标签和项目有一个ManyToMany关系:

class Tag(BaseModel):
    name = models.CharField(max_length=255)  # ToDo Change max length
    description = models.TextField(blank=True, null=True)


class Item(BaseModel):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    image = models.ImageField(upload_to='items', blank=True)
    title = models.TextField(blank=False, null=True)
    message = models.TextField(blank=True, null=True)
    fav_count = models.IntegerField(default=0)
    tags = models.ManyToManyField(Tag, related_name='tags')

我需要序列化所有字段,但我希望仅限制响应值。 例如:

我现在收到的内容:

{
    "user": 2,
    "image": null,
    "title": "test3",
    "message": "testmessage",
    "fav_count": 0,
    "tags": [
        {
            "id": 7,
            "name": "tag1",
            "description": null
        },
        {
            "id": 8,
            "name": "tag2",
            "description": null
        }
    ]
}

但我只希望收到标签ID而不是名称和说明......

我的简单观点:

if request.method == 'GET':
        items = Item.objects.all()
        serializer = ItemSerializer(items, many=True)
        return Response(serializer.data)

我是否需要重建我的响应数据以包含/排除或是否有更好的方法来执行此操作? (或者如果iv错过了术语)

2 个答案:

答案 0 :(得分:2)

在序列化程序中使用PrimaryKeyRelatedField DRF字段

实施例

class ItemSerializer(serializers.ModelSerializer):
    tags = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = Item
        fields = ('tags', 'image',.....other fields)

响应

{
    'image': 'image1',
    ...........
    'tags': [
        89,
        90,
        91,
        ...
    ]
    ..........
}

您希望根据请求参数动态执行此操作。

   class ItemSerializer(serializers.ModelSerializer):
        tags = serializers.SerializerMethodField()

   def get_tags(self, obj):
       if self.request.get('some_condition'):
           data_tags = TagSerializer(obj.tags, many=True).data
           data = map(data.pop('field_to_remove') for data in data_tags)
           return list(data)
       else:
           return TagSerializer(obj.tags, many=True).data

然后,在您的视图中初始化时,将请求传递给序列化程序。

serializer = ItemSerializer(data, context={'request':self.request})

答案 1 :(得分:0)

您有可能使用Tag模型的序列化程序并在ItemSerializer中声明它,因此视图显示完整的TagSerializer信息。
如果您只想显示pk字段,请使用默认表示,请勿在{{1​​}}

中为Tag声明特殊序列化程序