使用 Django Rest Framework 序列化程序发布到嵌套字段
Posted
技术标签:
【中文标题】使用 Django Rest Framework 序列化程序发布到嵌套字段【英文标题】:Post to nested fields with Django Rest Framework serializers 【发布时间】:2017-01-16 15:46:46 【问题描述】:我已设置我的序列化程序以成功返回嵌套内容。
但是,我无法在嵌套字段中发布数据。
发布数据时我没有收到错误,但它只发布到非嵌套字段。
我希望它采用“名称”字段或主键(模型“TAG”)来发布项目。
模型.py
class Tag(models.Model):
name = models.CharField("Name", max_length=5000, blank=True)
def __str__(self):
return self.name
class Movie(models.Model):
title = models.CharField("Whats happening?", max_length=100, blank=True)
tag = models.ManyToManyField('Tag', blank=True)
def __str__(self):
return self.title
序列化器.py:
class TagSerializer(serializers.ModelSerializer):
taglevel = filters.CharFilter(taglevel="taglevel")
class Meta:
model = Tag
fields = ('name', 'taglevel', 'id')
class MovieSerializer(serializers.ModelSerializer):
tag = TagSerializer(many=True, read_only=False)
info = InfoSerializer(many=True, read_only=True)
class Meta:
model = Movie
fields = ('title', 'tag', 'info')
def validate(self, data):
print(self.initial_data.__dict__)
data['tag_name'] = []
if 'tag' in self.initial_data.keys():
for entry in self.initial_data['tag']:
data['tag_name'].append(entry['name'])
return data
def create(self, validated_data):
print(validated_data)
tags_data = validated_data.pop('tag')
movie = Task.objects.create(**validated_data)
for tag_data in tags_data:
Movie.objects.create(name=name, **tag_data)
return movie
发布数据示例:
r = requests.post('http://localhost:8000/api/Data/', "title": "TEST_title", "tag": [ "name": "test1", "name": "test2" ], "info": [] )
【问题讨论】:
【参考方案1】:你的 json 应该是。
"title": "TEST_title",
"tag": [ "name": "test1" ,
"name": "test2"
],
"info": []
class TagSerializer(serializers.ModelSerializer):
taglevel = filters.CharFilter(taglevel="taglevel")
class Meta:
model = Tag
fields = ('name', 'taglevel', 'id')
class MovieSerializer(serializers.ModelSerializer):
tag = TagSerializer(many=True, read_only=False)
info = InfoSerializer(many=True, read_only=True)
class Meta:
model = Movie
fields = ('title', 'tag')
def create(self, validated_data):
tags_data = validated_data.pop('tag')
movie = Movie.objects.create(**validated_data)
for tag_data in tags_data:
movie.tag.create(**tag_data)
return movie
【讨论】:
这不起作用。我收到 500 错误(此处追溯-dpaste.com/0BB0ZE8)。所以我将“tag =”更改为“read_only=False”。这不再给出 500 错误,而是只发布了非嵌套数据。 对不起,我一开始没有测试它。但是我现在对其进行了测试,尽管我不得不省略(为了我的测试)Tag
序列化程序上的taglevel
字段。但我也意识到您为标签发布的 json 数据也不正确。 1. 字典中有重复的键。但这就是您为创建的电影创建标签的方式,
又是同样的问题。仅将数据发布到非嵌套字段。我这样发布- r = requests.post('localhost:8000/api/Data', "title": "TEST_title", "tag": [ "name": "test1" , "name": "test2 " ], "信息": [] )以上是关于使用 Django Rest Framework 序列化程序发布到嵌套字段的主要内容,如果未能解决你的问题,请参考以下文章
Django Rest Framework 和 django Rest Framework simplejwt 两因素身份验证
18-Django REST framework-使用Django开发REST 接口
如何在 django-rest-framework 中为 API 使用 TokenAuthentication
Django-rest-framework 和 django-rest-framework-jwt APIViews and validation Authorization headers