gpt4 book ai didi

django - DRF 和 Django admin 的通用自定义验证

转载 作者:行者123 更新时间:2023-12-03 19:39:25 29 4
gpt4 key购买 nike

我有用户表,其中必须对员工用户设置唯一的电子邮件限制,对非员工用户设置唯一的电话限制。现在我想在 DRF API 和 Django admin 中保持这种约束,如何在没有代码重复的情况下实现这一点。

正如我从 DRF 3.0 开始看到的,所有验证都是为序列化程序显式执行的(如果我覆盖了 unique_validation 或 clean 方法来执行条件验证,我也必须为序列化程序单独编写这个自定义验证),那么如何编写自定义验证适用于 DRF API 和 Django 管理员,无需重复代码?

最佳答案

如果您的模型没有嵌套关系,这应该可以工作。


class ValidateModelMixin(object)
def validate(self, attrs):
attrs = super().validate(attrs)
obj = self.Meta.model(**attrs)
obj.clean()
return attrs

class SomeModelSerializer(ValidateModelMixin, serializers.ModelSerializer):
#...
class Meta:
model = SomeModel

但就我而言,我有嵌套模型,我需要覆盖序列化程序中的 create() 和 update() 方法。我将验证仅保留在一个地方的解决方案:

def create(self, validated_data):
# Remove nested and M2m relationships from validated_data
firstmodel_set = validated_data.pop('firstmodel_set') if 'firstmodel_set' in validated_data else []
.....
# Get instance of project
instance = Project(**validated_data)
instance.clean()

# If clean method doesn't raise any exception, create.
project = instance.save()
......

如果你想序列化验证消息..也许类似的东西会帮助你......
def validate_instance(instance):
try:
# Call model validation
instance.clean()
except ValidationError as e:
raise serializers.ValidationError(e)

或者您可以使用 信号 并在 pre_save() 上进行验证。
看看 https://docs.djangoproject.com/en/1.10/topics/signals/

关于django - DRF 和 Django admin 的通用自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41542100/

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