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”: