【问题标题】:how to check username exit or not two different table in djnago rest framework如何在 django rest 框架中检查用户名是否存在两个不同的表
【发布时间】:2022-01-06 08:13:40
【问题描述】:

在 Tempdriver 表中注册新用户时需要验证用户名是否已存在于 tempdriver 表和 appuser 表中,如果检查 tempdriver 表用户名它是否工作但如果我检查 appuser 表出现错误,请有人帮助我。

models.py- 添加模型 Tempdriver 和 Appuser

class Tempdriver(BaseModel):
    name = models.CharField(max_length=255)
    username = models.CharField(max_length=20,unique=True,null=True, blank=True)
    mobile = models.CharField(max_length=20,unique=True,null=True, blank=True)
    password = models.CharField(max_length=100)

class AppUser(BaseModel):
    username = models.CharField(max_length=50)

seriliazers.py

class TempDriverUserSerializer(serializers.ModelSerializer):
    class Meta:
        model=Tempdriver
        fields=('username','mobile')
    def validate(self,username):       
        user=Tempdriver.objects.filter(username=username)
        user_exists = AppUser.objects.filter(username=username)
        if  user.exists() and user_exists.exists():
            raise serializers.ValidationError("UserName already exists")
        
    def validate_mobile(self, mobile):
        mobile=Tempdriver.objects.filter(mobile=mobile)
        if mobile.exists():
            raise serializers.ValidationError("Mobile Number already exists")

views.py

class Tempuserapi(APIView):
 
    parser_classes=(MultiPartParser,FormParser)
    def post(self, request, format=None):
        serializer = TempDriverUserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=HTTP_200_OK)
        else:
            return Response(serializer.errors, status= HTTP_200_OK)

跟踪报告

ERROR Internal Server Error: /api/tempusercheck/
Traceback (most recent call last):
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner   
    response = get_response(request)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\views.py", line 469, in handle_exception 
    self.raise_uncaught_exception(exc)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "E:\10dec_everestfleet\everest_jarvis\api\views.py", line 632, in post
    if serializer.is_valid():
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\serializers.py", line 220, in is_valid   
    self._validated_data = self.run_validation(self.initial_data)
  File "E:\10dec_everestfleet\everest_jarvis\env\lib\site-packages\rest_framework\serializers.py", line 423, in run_validation
    assert value is not None, '.validate() should return the validated data'
AssertionError: .validate() should return the validated data
ERROR "POST /api/tempusercheck/ HTTP/1.1" 500 20285

【问题讨论】:

    标签: python django django-rest-framework django-orm django-serializer


    【解决方案1】:

    您应该按照错误所述返回经过验证的数据。

    class TempDriverUserSerializer(serializers.ModelSerializer):
        class Meta:
            model=Tempdriver
            fields=('username','mobile')
    
        def validate_username(self,username):       
            user=Tempdriver.objects.filter(username=username)
            user_exists = AppUser.objects.filter(username=username)
            if  user.exists() and user_exists.exists():
                raise serializers.ValidationError("UserName already exists")
            return username
    
        def validate_mobile(self, mobile):
            mobile=Tempdriver.objects.filter(mobile=mobile)
            if mobile.exists():
                raise serializers.ValidationError("Mobile Number already exists")
            return mobile
    

    【讨论】:

    • 应用此代码时,它将在 tempdriver 表中创建新的用户名,我需要更改用户名退出或不是两个表就是这样,请帮助我。
    【解决方案2】:

    您没有在验证中返回任何内容。将您的验证更改为

    def validate(self,attrs):
        username = attrs.get('username')
        user=Tempdriver.objects.filter(username=username)
        user_exists = AppUser.objects.filter(username=username)
        if  user.exists() and user_exists.exists():
            raise serializers.ValidationError("UserName already exists")
        return attrs
    

    也可以在您的 validate_mobile 中返回移动设备

    【讨论】:

    • 它的返回用户名,但我想返回返回“用户名已经存在”
    • 我们不返回用户名。如果所有验证都通过,serializers.ValidationError("UserName already exists") 将返回“username already exists”然后我们返回数据
    • 我的意思是说我发布了 appuser 表用户名,它会在应用此代码时在 tempdriver 表中创建新用户,同时如果 tempdriver 中已经存在任何用户,则验证错误显示(用户名已经退出),在 appuser 表验证未得到应用
    • @Abdul Raffay 只有 tempdriver 表验证检查,appuser 表验证没有得到检查
    【解决方案3】:
    def validate_username(self,value):
            data = self.get_initial()
            username = data.get('username')
            tempdriver = Tempdriver.objects.filter(username=username).exists()
            appuser = AppUser.objects.filter(username=username).exists()
            if tempdriver :
                raise serializers.ValidationError("Username already exists")
            if appuser:
                raise serializers.ValidationError("Username already exists")
            return value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-22
      • 2020-12-16
      • 2022-07-22
      • 2013-11-29
      • 1970-01-01
      • 2020-06-17
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多