API経由で投稿するとき、シリアライザは同じ名前のタグが重複しないようにしたい。シリアライザが重複アイテムを作成しないようにする(ネストされたアイテムに対してupdate_or_create)
クラスタグの "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
それは私にAssertionErrorが告げるよう: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をここではトレース):動作しません.create()
方法は、デフォルトで書き込み可能なネストされたフィールドをサポートしていません。
django-taggitパッケージをお勧めします。私が使用する包括的なタグ付けソリューションです。アプリに組み込むのは簡単で、独自のタグ付けモデルを開発する際に発生する可能性のある面倒な問題を取り除きます。 https://github.com/alex/django-taggit –
提案していただきありがとうございますが、タグごとに個別の「タグレベル」を設定する必要があるため、適切ではありません。私はこれがあなたの提案された方法を使って可能であるとは思わない。セリライザーを使って私に見せてもらえますか? – Ycon