2015-02-09 190 views
2

我已經定義了一個串行這樣的:Django的REST框架驗證蛞蝓場

class ActivitySerializer(serializers.ModelSerializer): 
     activity_project = serializers.SlugRelatedField(queryset=Project.objects.all(), slug_field='project_name') 

activity_tags = serializers.SlugRelatedField(queryset=Tag.objects.all(), slug_field='tag_name', many=True) 
class Meta: 
    model = Activity 
    fields = ('activity_name', 'activity_description', 'activity_status', 'activity_completion_percent', 'activity_due_date', 'activity_project', 'activity_tags',) 

現在,如果我插入不存在於數據庫中的activity_tag,我得到一個驗證錯誤」

{ 
    "activity_tags": [ 
     "Object with tag_name=test does not exist." 
    ] 
} 

我想創建,增加了標籤在數據庫中,如果不存在,驗證方法。 我已經使用

def validate(self, attrs): 
    .... 
嘗試

方法,但顯然對於slug字段,有一種方法在此之前調用。

有人可以指向我應該使用的正確方法嗎?這個方法是否會在相應的視圖中被調用?

回答

1

我認爲你需要創建一個嵌套的序列化器才能工作。這完全是未經測試,從我的頭頂,但也許是這樣的:

class ActivityTagFieldSerializer(serializer.ModelSerializer): 
    tag_name = serializers.SlugField() 
    class Meta: 
     model = Tag 
     fields = ('tag_name') 

class ActivitySerializer(serializer.ModelSerializer): 
    activity_tags = ActivityTagFieldSerializer(many=True) 
    class Meta: 
     model = Activity 
     fields = ('activity_tags', 'activity_project', ...) 

    def create(self, validated_data): 
     tags = validated_data.pop('activity_tags') 
     activity = Activity.objects.create(**validated_data) 
     for tag in tags: 
      try: 
       tag_to_add = Tag.objects.get(**tag) 
      except: 
       tag_to_add = Tag.objects.create(**tag) 
      activity.activity_tags.add(tag_to_add) 
     return activity 

檢查API指南writable nested serializers