我如何在基于 api 的 django class 视图中调用自己的方法

How can i call own method in django class based api views

我想使用 phone 号码作为用户名创建帐户并生成 otp 代码。现在我想验证我的 phone 号码。我创建了一个方法 is_phone_valid 来验证我的 phone 号码,但通过 post 方法调用它,但出现错误 这是我的 views.py

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        return self.is_phone_valid(phone_number)

models.py

class TempRegistration(models.Model):
    phone_number = models.CharField(max_length=45)
    otp_code = models.CharField(max_length=6)

    def __str__(self):
        return self.phone_number

如果你想提取 POST parameters [wiki] 中的 phone 号码,那么你应该在 self.request.POST 中访问它。

此外,您不能 return 布尔值作为请求的结果。这需要是 HttpResponse,例如 JsonResponse object [Django-doc]:

from django.http import JsonResponse

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(self, phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        return <b>JsonResponse(</b>
            {'result': self.is_phone_valid(<b>self.request.POST.get('phone_number')</b>)}
        <b>)</b>

您必须定义 phone_number 变量。我希望你使用的是 DRF,那么参数 phone_number 将在 request.data

中可用
class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        phone_number = request.data['phone_number']
        return Response({'result' : self.is_phone_valid(phone_number)})

您似乎在使用 Django REST Framework. If so, use field-level--DRF doc validation of DRF Serializers,如下所示

# views.py
class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer


# serializers.py
class AccountsSerializer(serializers.ModelSerializer):
    def validate_phone_number(self, phone_number):
        MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
        if MOBILE_REGEX.match(phone_number):
            return phone_number
        else:
            raise serializers.ValidationError('No. not matching')

    class Meta:
        model = TempRegistration
        fields = '__all__'

注意:不需要覆盖post(...)方法[=12] =]class.

您 posted 的回溯说明它找不到您在 post 方法中传递给 self.is_phone_valid(phone_number)phone_number

其次,您的问题是如何从 class 内部调用 is_phone_valid?您需要将 pass self 作为此方法的第一个参数。

class GetPhoneNumber(CreateAPIView):
    queryset = TempRegistration.objects.all()
    serializer_class = AccountsSerializer

    def is_phone_valid(self, phone_number):
        if phone_number:
            MOBILE_REGEX = re.compile('^(?:\+?88)?01[15-9]\d{8}$')
            if MOBILE_REGEX.match(phone_number):
                return True
            else:
                return False
        else:
            return False

    def post(self, request, *args, **kwargs):
        phone_number = request.data['phone_number']
        return self.is_phone_valid(phone_number)