gpt4 book ai didi

python - Django REST Framework 验证 slug 字段

转载 作者:行者123 更新时间:2023-11-28 18:39:24 24 4
gpt4 key购买 nike

我定义了这样一个序列化器:

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 字段,有一个方法在此之前被调用。

有人能指出我应该使用的正确方法吗?这个方法会在相应的 View 中被调用吗?

最佳答案

我认为您需要创建一个嵌套的序列化程序才能使其工作。这完全未经测试并且超出了我的脑海,但也许是这样的:

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

查看 writable nested serializers 的 API 指南

关于python - Django REST Framework 验证 slug 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28404298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com