2017-02-12 75 views
0

我正在嘗試發佈默認值。使用DRF中的序列化程序發佈默認值

用簡單的英語,這就是我想要的工作:

  1. 如果數據沒有「標籤」字段(S)
  2. 檢查是否標記爲「無」的情況下(對「主人「)
  3. 如果標記爲‘無’的存在,創建M2M
  4. 如果標記爲「無」不存在,創建標籤沒有(對‘主人’)

我後數據將不是包含正在發佈的JSON數據中的字段tag

此代碼工作完全在沒有tag

當沒有標記字段,它告訴

示例數據我「是必需的標籤字段」被張貼

{title: "Testing"} EXCEPT

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

你ItemSerializer現在應該是這樣的:

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

不,這並不工作。它停止了「需要標記字段」的錯誤,但沒有設置它需要的默認「標記字段」。請給出另一個建議 – Ycon

+0

@Ycon,而不是'default = None'把'required = False'請 – doggra

+0

不行。我已經使用了'require = False',但它給了我一個關鍵的錯誤。如果'get_or_create'不存在,實際上會創建一個名爲「None」的標籤嗎?這是追溯http://dpaste.com/1BYMTDT – Ycon

相關問題