阻止序列化程序创建重复项(嵌套项上的update_or_create)

时间:2016-09-09 16:44:03

标签: python django django-rest-framework

当我通过API发布时,我希望序列化程序不会复制标记(如果存在同名的标记)。

我尝试添加" unique"到" name"的模型领域在课程标签中,但这不起作用 - 它不允许我创建链接到存在的标签的其他电影。

  • 检查字段" name"已存在(案例不敏感)。

  • 如果标签"名称"存在,只需创建与FK的关系 现有标签名称&新电影

  • 如果标签"名称"不存在,创建它

Models.py

class Tag(models.Model):
    name = models.CharField("Name", max_length=5000, blank=True)
    taglevel = models.IntegerField("Tag level", 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

Serializers.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')

def get_or_create(self, validated_data):
    tags_data = validated_data.pop('tag')
    task = Task.objects.get_or_create(**validated_data)
    for tag_data in tags_data:
        task.tag.get_or_create(**tag_data)
    return task

get_or_create不起作用(在此跟踪:http://dpaste.com/2G0HESS)因为它告诉我AssertionError:默认情况下.create()方法不支持可写嵌套字段。

1 个答案:

答案 0 :(得分:1)

您必须为模型编写自定义创建方法。 Here is why.