Django 序列化程序中的对象级验证无法识别函数
object-level validation in django serializers does not recognize function
class serializer_blahblah(serializers.ModelSerializer):
"""Serializer for ProfileUsefulRecommendations."""
profile_id = serializers.UUIDField()
recommendation_id = serializers.UUIDField()
class Meta:
"""Meta class."""
fields = (
"id",
"profile_id",
...
此序列化程序一切正常,但我决定添加对象级验证
这是发生的事情:
def validate(self, data):
recommendation_id = str(data["recommendation_id"])
print("recommendation: ", recommendation_id)
validate_recommendation_id(recommendation_id=recommendation_id)
print(validate_recommendation_id(recommendation_id=recommendation_id))
return data
打印出来:
recommendation: 3a232d0d-0705-4775-8bae-0e2f3d69c96c
连函数都不识别....
但是,如果我在单个字段序列化程序中使用完全相同的函数,则一切顺利。但很快我需要它作为对象级别
添加函数代码:
def validate_recommendation_id(recommendation_id):
try:
Recommendation.objects.get(id=recommendation_id)
except Recommendation.DoesNotExist as exception:
raise serializers.ValidationError(
{f"{recommendation_id}": "does not exist"}
) from exception
return recommendation_id
这就是您为每个字段添加验证的方式。
class serializer_blahblah(serializers.ModelSerializer):
recommendation_id = serializers.UUIDField()
def validate_recommendation_id(self, recommendation_id):
return recommendation_id
您不在 validate
方法中调用它。
实际上,伙计们,我已经想出了这样的解决方案。
我定义了
而不是验证函数
Class CheckIfObjectHasId(queryset, lookup_object)
后来我在序列化程序中调用了它:
class serializer_blahblah(serializers.ModelSerializer):
"""Serializer for ProfileUsefulRecommendations."""
profile_id = serializers.UUIDField(
validators=[
CheckIfObjectHasId(queryset=Profile.object.all(), lookup_object="id"
]
)
class serializer_blahblah(serializers.ModelSerializer):
"""Serializer for ProfileUsefulRecommendations."""
profile_id = serializers.UUIDField()
recommendation_id = serializers.UUIDField()
class Meta:
"""Meta class."""
fields = (
"id",
"profile_id",
...
此序列化程序一切正常,但我决定添加对象级验证
这是发生的事情:
def validate(self, data):
recommendation_id = str(data["recommendation_id"])
print("recommendation: ", recommendation_id)
validate_recommendation_id(recommendation_id=recommendation_id)
print(validate_recommendation_id(recommendation_id=recommendation_id))
return data
打印出来:
recommendation: 3a232d0d-0705-4775-8bae-0e2f3d69c96c
连函数都不识别....
但是,如果我在单个字段序列化程序中使用完全相同的函数,则一切顺利。但很快我需要它作为对象级别
添加函数代码:
def validate_recommendation_id(recommendation_id):
try:
Recommendation.objects.get(id=recommendation_id)
except Recommendation.DoesNotExist as exception:
raise serializers.ValidationError(
{f"{recommendation_id}": "does not exist"}
) from exception
return recommendation_id
这就是您为每个字段添加验证的方式。
class serializer_blahblah(serializers.ModelSerializer):
recommendation_id = serializers.UUIDField()
def validate_recommendation_id(self, recommendation_id):
return recommendation_id
您不在 validate
方法中调用它。
实际上,伙计们,我已经想出了这样的解决方案。 我定义了
而不是验证函数Class CheckIfObjectHasId(queryset, lookup_object)
后来我在序列化程序中调用了它:
class serializer_blahblah(serializers.ModelSerializer):
"""Serializer for ProfileUsefulRecommendations."""
profile_id = serializers.UUIDField(
validators=[
CheckIfObjectHasId(queryset=Profile.object.all(), lookup_object="id"
]
)