【问题标题】:Django rest framework - Create or update values from jsonDjango rest 框架 - 从 json 创建或更新值
【发布时间】:2018-09-14 09:43:45
【问题描述】:

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

{
    "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

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

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 模型一起保存?

如果您想了解更多信息,请告诉我

提前致谢

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我认为你可以使用Django的get_or_create()方法,

    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, created) 的元组,其中 object 是检索或创建的对象, created 是一个布尔值,指定是否有新对象已创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-25
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多