Django Rest Framework-从JSON创建或更新值 [英] Django rest framework - Create or update values from json

查看:49
本文介绍了Django Rest Framework-从JSON创建或更新值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Django和Django Rest Framework非常陌生.我有一个JSON格式如下的API(为简化起见,为简化版)

I am very much new to Django and Django Rest Framework. I have an API whose json format is as below (Simplified version for sake of simplicity)

{
    "title" : "Lorem ipsum is a dummy title",
    "content" : "Lorem ipsum is a demo content"
    "tags" : ["Movies", "Food"]
}

这是我的模型的样子:

class Tag(models.Model):

    class Meta:
         verbose_name_plural = "Tags"

    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

class Post(models.Model):

    class Meta:
        verbose_name_plural = "Posts"

    title = models.CharField(max_length=255)
    content = models.TextField()
    tags = models.ManyToManyField(Tag, blank=True)

    def __str__(self):
        return self.title

这是我的序列化程序(标签,帖子)的样子:

Here is how my serializer (Tags, Posts) looks like:

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag
        fields = '__all__'

    name = serializers.CharField(max_length=200)

    def create(self, validated_data):
        return Tag.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.save()
        return instance

class PostSerializer(serializers.ModelSerializer):

    class Meta:
        model = Post
        fields = ('title', 'content', 'tags')

    title = serializers.CharField(max_length=250)
    content = serializers.CharField(max_length=1000)
    tags = serializers.PrimaryKeyRelatedField(many=True, queryset=Tag.objects.all())

    def create(self, validated_data):
        tags = validated_data.pop('tags')
        # [do i need to look for tags, create if not exists and retrieve the ids]

        post = Post.objects.create(**validated_data)
        for tg in tags:
            post.tags.add(tg)
        return post

    def update(self, instance, validated_data):
        instance.title = validated_data.get('title', instance.title)
        instance.content = validated_data.get('content', instance.content)

        tags = validated_data.pop('tags')

        # [do i need to check for tags, create if not exists and retrieve the ids]
        instance.save()
        return instance

因此,我希望用标签保存帖子的详细信息,以便它创建标签(如果不存在).由于我是django和rest框架的新手,因此我不确定是否有一些现成的功能可以实现此目标.还是我需要在我的 PostSerializer 中编写一些代码来手动创建新标签并返回ID,然后将它们保存为Post模型?

So I wish to save the post details with tags such that it create the tags if not exists. As i am new to django and rest framework i am not sure if there is some out of the box functionality available to achieve this. Or do I need to write some code in my PostSerializer that manually creates new tags and return the ids, then save them with post model?

如果您需要更多信息,请告诉我

Let me know if you want further information

预先感谢

推荐答案

我认为您可以使用Django的

I think you can use Django's get_or_create() method as,

def create(self, validated_data):
    tags = validated_data.pop('tags')
    post = Post.objects.create(**validated_data)
    for tag in tags:
        tag_obj, create = Tag.objects.get_or_create(name=tag)
        post.tags.add(tag_obj)
    return post

get_or_create() 方法将返回 (对象,已创建) 的元组,其中object是检索或创建的对象以及创建的对象是一个布尔值,指定是否创建了新对象.

The get_or_create() method will return a tuple of (object, created), where object is the retrieved or created object and created is a boolean specifying whether a new object was created.

这篇关于Django Rest Framework-从JSON创建或更新值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆