Python Django REST框架验证slug字段

Python Django REST框架验证slug字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,我定义了如下序列化程序: class ActivitySerializer(serializers.ModelSerializer): activity_project = serializers.SlugRelatedField(queryset=Project.objects.all(), slug_field='project_name') activity_tags = serializers.SlugRelatedField(queryset=Tag.objects.al

我定义了如下序列化程序:

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',)
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
现在,如果插入数据库中不存在的activity_标记,则会出现验证错误“

我想创建一个验证方法,在数据库中添加不存在的标记。 我试过使用

def validate(self, attrs): 
    ....
方法,但显然对于slug字段,有一个方法是在这个方法之前调用的


有人能告诉我应该使用哪个方法吗?这个方法会在相应的视图中被调用吗?

我想你需要创建一个嵌套的序列化程序才能工作。这完全没有经过测试,我不知道,但可能是这样的:

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',)
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指南中的

我通过子类化SlugRelatedField并重写“to_internal_value”方法实现了这一点。在最初的实现中,此方法尝试从queryset获取对象,如果对象不存在,则验证失败。因此,我不调用“get”方法,而是调用“get_或_create”: