2015-02-09 187 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