我有用户表,其中必须对工作人员用户设置唯一的电子邮件限制,对非工作人员用户设置唯一的电话约束。现在,我想在DRF API和Django admin中维护这个约束,如何在不重复代码的情况下实现这一点。
从DRF 3.0开始,所有验证都是针对序列化程序显式执行的(如果我已经重写了unique_validation或clean方法来执行条件验证,我也必须为序列化程序分别编写这个自定义验证),那么如何编写一个既适用于DRF,又适用于Django管理的自定义验证,而不需要重复代码呢?
发布于 2017-01-09 16:56:30
FOR API:为UserRegistration创建一个序列化程序,并使用两个条件实现验证方法,一个条件是唯一的电子邮件,另一个条件是电话号码。类似于:
class UserCreateSerializer(ModelSerializer):
   class Meta:
        model = User
        fields = ['email','phone','...']
   def validate(self, data):
        """user email phone validator """
        user_qs = User.objects.filter(email=data['email'], is_staff=True)
        if user_qs.exists():
            raise ValidationError({"email":"This user has already registered."})
        user_phone = User.objects.filter(phone=data['phone'], is_active=True, is_staff=False)
        if user_phone.exists():
            raise ValidationError({"phone":"Phone number already exists."})
        return dataFOR WEB: --如果您已经创建了表单以便注册,那么在表单中实现clean方法,在序列化程序中进行验证,如上面所示。
class UserCreateForm(ModelForm):
    class Meta:
            model = User
            fields = ['email','phone','...']
    def clean(self):
            """user email phone validator """
            user_qs = User.objects.filter(email=self.cleaned_data['email'], is_staff=True)
            if user_qs.exists():
                raise ValidationError({"email":"This user has already registered."})
            user_phone = User.objects.filter(phone=self.cleaned_data['phone'], is_active=True, is_staff=False)
            if user_phone.exists():
                raise ValidationError({"phone":"Phone number already exists."})
            return datahttps://stackoverflow.com/questions/41542100
复制相似问题