django rest框架url参数,补丁不起作用

时间:2016-04-18 01:41:05

标签: python django django-rest-framework

修改

我怀疑我的UpdateApiView的整个问题都在于url。无论我如何更改它,都会返回404。

url(r'verify-phone/(?P<phone_id>^\d+)$', view.VerifyPhone.as_view(), name='verify-phone'),

它返回

{
    "detail": "Not found."
}


[18/Apr/2016 01:39:02] "PATCH /api/verify-phone/phone_id=00980 HTTP/1.1" 404 4941

为什么?

views.py

class VerifyPhone(generics.UpdateAPIView):
    permission_classes = (AllowAny,)
    serializer_class = serializers.VerifyPhoneSerializer
    allowed_methods = ['PATCH']
    lookup_field = 'phone_id'

    def get_queryset(self):
        phone_id = self.request.query_params.get('phone_id', None)
        queryset = User.objects.filter(phone_id=phone_id)
        return queryset

def update(self, request, *args, **kwargs):
    print('inside update')
    print(request.data)
    partial = kwargs.pop('partial', False)
    instance = self.get_object()
    print(instance)
    serializer = self.get_serializer(instance, data=request.data, partial=partial)
    print(serializer)
    serializer.is_valid(raise_exception=True)
    self.perform_update(serializer)
    print('done perform update')
    return Response(serializer.data)

serializers.py

class VerifyPhoneSerializer(serializers.ModelSerializer):
    regex = r'\d+'
    verification_code = serializers.RegexField(regex, max_length=7, min_length=7, allow_blank=False)
    phone_id = serializers.HyperlinkedRelatedField(view_name='verify-phone', lookup_field='phone_id', read_only=True)

    class Meta:
        model = User
        fields = ('verification_code', 'phone_id')

    def validate(self, data):
        verification = api.tokens.verify(data['phone_id'], data['verification_code'])

        if verification.response.status_code != 200:
            raise serializers.ValidationError("Invalid verification code.")

        return data

def update(self, instance, validated_data):
    instance.phone_number_validated = True
    instance.save()
    return instance
  

第二个问题从视图中获取phone_id是否正确?

phone_id = serializers.HyperlinkedRelatedField(view_name='verify-phone', lookup_field='phone_id', read_only=True)

1 个答案:

答案 0 :(得分:1)

看看你的api url def,我想你应该打电话:

/api/verify-phone/00980

而不是

/api/verify-phone/phone_id=00980

我也认为url def本身有问题(^之前的^):

url(r'verify-phone/(?P<phone_id>^\d+)$', view.VerifyPhone.as_view(), name='verify-phone')

应该是

url(r'verify-phone/(?P<phone_id>\d+)$', view.VerifyPhone.as_view(), name='verify-phone')

url(r'verify-phone/(?P<phone_id>\d{5})$', view.VerifyPhone.as_view(), name='verify-phone')