0

Bisher Schaffung Ich habe ->Überprüfen Sie, ob Benutzer vorhanden ist, bevor neue Benutzer djangorestframework

Serializer:

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 

Ansicht:

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()), 

Ich brauche für OTP von mobilen und E-Mail überprüfen und auch wenn ein Benutzer mit demselben Handy oder derselben E-Mail bereits existiert. Wenn der Benutzer bereits existiert, geben Sie eine JSON-Antwort mit dem folgenden Fehler zurück: already exists!. Wenn der Benutzer neu ist und OTP falsch ist, wird ein Fehler ausgegeben. Wenn der Benutzer neu ist und OTP korrekt ist, erstellen Sie ein Konto.

Problem hier ist, habe ich versucht, die Funktion hinzuzufügen, um innerhalb der def createof UserSerializer für otp Überprüfung zu überprüfen. Ein Serializer soll jedoch die Modellinstanz zurückgeben. Aber wenn Sie den Code sehen, kann ich einen Benutzer nur erstellen, wenn OTP richtig ist und eine Benutzerinstanz zurückgegeben wird. Und es gibt keine else.

Gibt es also eine bessere Möglichkeit, in der Ansicht selbst nach OTP zu suchen?

Antwort

0

Das ist nicht die richtige Art, es zu implementieren. Serialisierer sind nur für Validierungszwecke gedacht. Sie sollten die Methode create nicht im Serializer implementieren, sondern stattdessen in ViewSet schreiben. Objekt erstellen ist eine Geschäftslogik. Es sollte immer in einem ViewSet gehen. Schreiben Sie eine Validierungsmethode in den Serializer. Ich schreibe ein Beispiel-Code unten

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 (Business Logic)

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

Wird dies nicht im Falle einer Aktualisierung stören, wenn das Feld nicht aktualisiert wird? –

1

ich nicht mit @Anjaneyulu zustimmen es .. Serializer Griffe Erstellen von Objekten als auch .. daher der Grund, warum Sie haben serializer.save().

Aber um eine Ausnahme für bestehende Benutzer mit der gleichen OTP-E-Mail/Telefon auszulösen, sollten Sie Ihre eigenen def validate_mobile(self, data) und def validate_email(self, data) schreiben. Der DRF-Serializer sucht zuerst nach diesen Methoden in der Klasse und führt sie aus, wenn sie existieren. Ihre benutzerdefinierte Logik zum Überprüfen dieser Felder könnte also wie folgt aussehen:

Verwandte Themen