我与标签和项目有一个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错过了术语)
答案 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
声明特殊序列化程序