2017-02-12 83 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

相关问题