Django Rest Framework - Создание или обновление значений из JSON - PullRequest
0 голосов
/ 14 сентября 2018

Я очень новичок в Django и Django Rest Framework. У меня есть API, формат которого json, как показано ниже (упрощенная версия для простоты)

{
    "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 и остальных фреймворках, я не уверен, есть ли какие-то готовые функциональные возможности для достижения этой цели. Или мне нужно написать некоторый код в моем PostSerializer , который вручную создает новые теги и возвращает идентификаторы, а затем сохраняет их с моделью поста?

Дайте мне знать, если вам нужна дополнительная информация

Заранее спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Я думаю, вы можете использовать метод Джанго 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.<b>get_or_create(name=tag)</b>
        post.tags.add(tag_obj)
    return post

Метод get_or_create() вернеткортеж (object, created), где объект - это извлеченный или созданный объект, а созданный является логическим значением, указывающим, был ли создан новый объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...