使用 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

django rest framework中文介绍

使用 django-rest-framework-simplejwt 注册后返回令牌