Django Rest Framework-从JSON创建或更新值 [英] Django rest framework - Create or update values from 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
预先感谢
推荐答案
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屋!