2016-09-09 12 views
0

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()方法は、デフォルトで書き込み可能なネストされたフィールドをサポートしていません。

+0

django-taggitパッケージをお勧めします。私が使用する包括的なタグ付けソリューションです。アプリに組み込むのは簡単で、独自のタグ付けモデルを開発する際に発生する可能性のある面倒な問題を取り除きます。 https://github.com/alex/django-taggit –

+0

提案していただきありがとうございますが、タグごとに個別の「タグレベル」を設定する必要があるため、適切ではありません。私はこれがあなたの提案された方法を使って可能であるとは思わない。セリライザーを使って私に見せてもらえますか? – Ycon

答えて

1

モデルのカスタム作成メソッドを記述する必要があります。 Here is why.

+0

問題のカスタムメソッドのコードを表示してください – Ycon

+0

正しいコードで質問を更新できますか?ムービーモデルとタグモデルの多対多の関係で問題があるとしますが、定義されていないタスクモデルのレコードを作成しています。 – user6399774

関連する問題