如何在基于Django类的api视图中调用自己的方法

2024-10-02 04:27:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用电话号码作为用户名创建帐户,并生成otp代码。现在我想验证我的电话号码。我创建了一个有效的方法来验证我的电话号码,但是通过post方法调用它,但是我得到了一个错误error image 这是我的观点

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

Tags: 方法selfnumberreturnifismodelsdef
3条回答

似乎您正在使用Django REST Framework。如果是,请使用DRF Serializersfield-level--DRF doc验证,如下所示

# 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(...)类的CreateAPIView方法

您发布的回溯说明,它无法在post方法中找到要传递给self.is_phone_valid(phone_number)phone_number

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

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)

您必须定义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)})

相关问题 更多 >

    热门问题