0

之前存在到目前为止,我有 - >检查用户创建新的用户djangorestframework

串行:

class UserSerializer(serializers.ModelSerializer): 
    """Serializer to map the model instance into json format.""" 
    class Meta: 
     """Map this serializer to a model and their fields.""" 
     model = User 
     fields = ('id','username', 'mobile', 'password', 
        'first_name','last_name','middle_name', 
        'profile_pic','short_bio','friends_privacy', 
        'address_1','address_2','city', 
        'state','country','pin','verification_code', 
        'is_active','is_blocked','is_reported', 
        'date_created','date_modified') 
     extra_kwargs = {'password': {'write_only': True}} 
     read_only_fields = (
      'date_created', 'date_modified', 
      'is_staff', 'is_superuser', 'is_active', 
      'date_joined',) 
    def create(self, validated_data): 
     mobile_ = validated_data['mobile'] 
     password_ = validated_data['password'] 
     username_ = validated_data['username'] 
     motp = self.context['request'].GET['motp'] 
     eotp = self.context['request'].GET['eotp'] 
     email_ = self.context['request'].GET['email'] 
     mflag = api.views.checkOTP_(mobile_,motp) 
     eflag = api.views.checkOTP_(email_,eotp) 
     if (mflag and eflag): 
      user = User(
      username=username_, 
      email =email_, 
      password = make_password(password_), 
      mobile = mobile_, 
      ) 
      user.set_password(validated_data['password']) 
      user.save() 
      return user 

观点:

class UserView2(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    model = User 

    def get_permissions(self): 
     # allow non-authenticated user to create via POST 
     return (AllowAny() if self.request.method == 'POST' 
       else IsStaffOrTargetUser()), 

我需要检查的手机和电子邮件OTP并且如果具有相同移动设备或电子邮件的用户已经存在。 如果用户已存在,则返回错误的json响应:already exists!。 如果用户是新的并且OTP错误再次发生错误。 如果用户是新的并且OTP正确,请创建一个帐户。

这里的问题是我试图添加函数来检查def createof UserSerializer里面的otp验证。但是一个序列化器应该返回模型实例。但是,如果您看到代码,则只有在OTP正确且用户实例返回的情况下,才能创建用户。并没有else

那么是否有更好的方法来检查视图本身的OTP?

回答

0

这不是实现它的正确方法。串行器仅用于验证目的。您不应该在串行器中实现create方法,而应将其写入ViewSet。创建对象是一种业务逻辑。它应该总是在ViewSet。向串行器写一个验证方法。我在写下面

serializers.py

class UserSerializer(serializers.ModelSerializer): 

    def validate_mobile(self, mobile_num): 
     is_already_exists = Model.objects.filter(mobile=mobile_num).exists() 
     if is_already_exists: 
      raise serializers.ValidationError('already exists') 
     return mobile_num 

    class Meta: 
     model = User 
     fields = (
      'id','username', 'mobile', 'password', 
      'first_name','last_name','middle_name','profile_pic', 
      'short_bio','friends_privacy','address_1', 
      'address_2','city','state','country', 
      'pin','verification_code','is_active', 
       'is_blocked','is_reported', 
      'date_created','date_modified' 
     ) 
     extra_kwargs = {'password': {'write_only': True}} 
     read_only_fields = (
      'date_created', 'date_modified','is_staff', 
      'is_superuser', 'is_active', 'date_joined', 
     ) 

Viewsets.py(业务逻辑)

class UserView2(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

    def get_permissions(self): 
     # allow non-authenticated user to create via POST 
     return (AllowAny() if self.request.method == 'POST' 
       else IsStaffOrTargetUser()), 
    def create(self, serializer): 
      # your logic goes here. 
+0

如果字段没有更新,这是否会干扰更新的情况? –

1

一个示例代码我不@Anjaneyulu有.. 串行手柄同意创建对象以及..因此,你有serializer.save()的原因。

但对于提高现有的具有相同的OTP邮件/电话用户异常的目的,你应该写自己的def validate_mobile(self, data)def validate_email(self, data)。 DRF序列化程序将首先在类中查找这些方法,并在它们存在时运行它们。因此,您的用于检查这些字段的定制逻辑可能是:

class UserSerializer(serializers.ModelSerializer): 
    def validate_mobile(self, value): 
     ModelClass = self.Meta.model 
     if ModelClass.objects.filter(mobile=value).exists(): 
      raise serializers.ValidationError('already exists') 
     return value 

    def validate_email_(self, value): 
     ModelClass = self.Meta.model 
     if ModelClass.objects.filter(email_=value).exists(): 
      raise serializers.ValidationError('already exists') 
     return value 
    class Meta: 
     model = User 
     fields = (
      ..., 
     )