2017-02-12 4 views
0

デフォルト値を送信しようとしています。平易な英語でDRFにシリアライザを使用したデフォルト値の転記

が、これは私はそれが仕事をしたい方法です:

  1. データがない「タグ」フィールド(複数可)
  2. を持っていない場合は、タグ「なし」は所有者のために(存在しないかどうかを確認します「)
  3. タグ 『なし』が存在しない場合は、タグ「どれも場合
  4. は、M2M作成
  5. 、」が存在しません、 『所有者』)のために(タグなしを作成していないが

私のポストデータがするではなくには、投稿されているJSONデータにフィールドtagが含まれています。

なしタグフィールドが存在しない場合には、このコードは何tagフィールドが存在しない

除き完璧に動作し、それは私に指示「タグフィールドが必要とされる」

例データは

{title: "Testing"}を掲載されています

Models.py

class Tag(models.Model): 
    name = models.CharField("Name", max_length=5000, blank=True) 
    taglevel = models.IntegerField("Tag level", null=True, blank=True) 
    owner = models.ForeignKey('auth.User', blank=True, null=True)v 

class Item(models.Model): 
    title = models.CharField("Title", max_length=10000, blank=True) 
    tag = models.ManyToManyField('Tag', blank=True) 
    owner = models.ForeignKey('auth.User', blank=True, null=True) 

シリアライザ

class ItemSerializer(serializers.ModelSerializer): 
    tag = TagSerializer(many=True, read_only=False) 
    info = InfoSerializer(many=True, read_only=True) 
    class Meta: 
     model = Item 
     ordering = ('-created',) 
     fields = ('title', 'pk', 'tag') 

    def create(self, validated_data): 
     tags_data = validated_data.pop('tag') 
     owner = self.context['request'].user 
     item = Item.objects.create(owner=owner, **validated_data) 
     for tag_data in tags_data: 
      tag_data['owner'] = owner 
      tag_qs = Tag.objects.filter(name__iexact=tag_data['name']) 

      if not tag_data: 
       Tag.objects.get_or_create(tag_name="None") 

      if tag_qs.exists(): 
       tag = tag_qs.first() 
      else: 
       tag = Tag.objects.create(**tag_data) 
      item.tag.add(tag) 
     return item 

答えて

0

はItemSerializerのあなたのタグフィールドにdefault=Noneを設定してみてください。いや、これは動作しませんでした

class ItemSerializer(serializers.ModelSerializer): 
    tag = TagSerializer(default=None, many=True, read_only=False) 
    info = InfoSerializer(many=True, read_only=True) 
    ... 
+0

あなたItemSerializerは今のように見えるはずです。それは "tag field required"エラーを停止しましたが、必要なデフォルトの "tag field"を設定しませんでした。別の提案をしてください。 – Ycon

+0

@Ycon、 'default = None'の代わりにput' required = False'してください – doggra

+0

運がいいです。代わりに 'require = False'を使用しましたが、それは私に重要なエラーを与えます。 'get_or_create'は実際に存在しない場合、" None "というタグを作成しますか?これはトレースバックです。http://dpaste.com/1BYMTDT – Ycon

関連する問題