![](/img/trans.png)
[英]How to send a post request via postman to nested writable serializer in django-rest-framework?
[英]How to send POST data to nested Serializer Django Rest Framework?
我正在編寫一個示例程序,其中可以將標簽添加到待辦事項列表。 所以我創建了標簽樣本。 但是當我在將其添加到Todo序列化程序時遇到麻煩時。
這是我寫的序列化器。
class TagSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(required=False, max_length=100)
def create(self, validated_data):
return Tag.objects.create(**validated_data)
class LocationSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
latitude = serializers.CharField(max_length=100)
longitude = serializers.CharField(max_length=100)
def create(self, validated_data):
return Location.objects.create(**validated_data)
class ToDoSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
work_id = serializers.CharField(max_length=100)
tags = TagSerializer(many=True)
location = LocationSerializer()
我嘗試將數據作為POST發送到ToDo序列化程序。 但是如何將位置和標簽詳細信息發送到API視圖。
API視圖
class ToDoList(APIView):
def post(self, request, format=None):
serializer = ToDoSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我如何將數據作為POST傳遞到ToDoList。 我是否必須在ToDoSerializer上編寫自定義帖子視圖?
楷模
class Tag(models.Model):
name = models.CharField(max_length=100)
class Location(models.Model):
latitude = models.CharField(max_length=100)
longitude = models.CharField(max_length=100)
class ToDo(models.Model):
work_id = models.CharField(max_length=100)
tags = models.ManyToManyField(Tag)
location = models.ForeignKey(Location)
您的請求POST數據應看起來像嵌套結構,如序列化程序中聲明的那樣。 並且,您應該為此使用模型序列化器,因為否則,您將不得不在ToDoSerializer
上提供自定義create
方法,因為常規序列化器不知道如何使用嵌套結構/模型。
所以,我建議的是:
from rest_framework import serializers
class ToDoSerializer(serializers.ModelSerializer):
tags = TagSerializer(many=True)
location = LocationSerializer()
class Meta:
model = ToDo
fields = ('tags', 'location', 'work_id', 'id')
您的發布json應該如下所示:
{
"work_id": 1,
"tags" : [
{"name": "blah"},
{"name": "blahblah"}
],
"location": {
"latitude": 11.22,
"longitude": 33.44
}
}
您需要處理ToDoSerializer serialzier的create方法。 docs 嵌套嵌套表示形式
您可以嘗試如下操作:
def create(self, validated_data):
location_data = validated_data.pop('location')
tag_data = validated_data.pop('tags')
location = Location.objects.create(**location_data)
instance = ToDo.objects.create(location=location, **validated_data)
for dct in tag_data:
dct.pop('id', None)
tag, created = Tag.objects.get_or_create(**dct)
// tag = Tag.objects.create(**dct)
instance.tags.add(tag)
return instance
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.