编程语言
首页 > 编程语言> > python – Django网址空值

python – Django网址空值

作者:互联网

我有一个django应用程序,我打电话给api如下:(api.py)

class studentList(APIView):
    def get(self, request, pk, pk2, format=None):
        student_detail = Student.objects.filter(last_name = pk, campus_id__name = pk2)
        serialized_student_detail = studentSerializer(student_detail, many=True)
        return Response(serialized_student_detail.data)

在网址中,我正在做以下事情:

url(r'^api/student/(?P<pk>.+)/(?P<pk2>.+)/$', api.studentList.as_view()),

现在的问题是我的应用程序有一个搜索功能,它将参数pk和pk2发送到api.有时,用户可以仅选择这些参数中的一个来执行搜索操作.因此,当只选择一个参数时,url看起来像这样:

http://localhost:8000/api/student/##value of pk//

要么

http://localhost:8000/api/student//##value of pk2/

那么我将如何使查询仍然有效,如何创建一个url,使其甚至接受这些参数?

解决方法:

使用.*(0或更多)代替. (至少1个或更多):

url(r'^api/student/(?P<pk>.*)/(?P<pk2>.*)/$', api.studentList.as_view()),

演示:

>>> import re
>>> pattern = re.compile('^api/student/(?P<pk>.*)/(?P<pk2>.*)/$')
>>> pattern.match('api/student/1//').groups()
('1', '')
>>> pattern.match('api/student//1/').groups()
('', '1')

请注意,现在,在视图中,您应该处理pk和pk2的空字符串值:

class studentList(APIView):
    def get(self, request, pk, pk2, format=None):
        student_detail = Student.objects.all()
        if pk:
            student_detail = student_detail.filter(last_name=pk)
        if pk2:
            student_detail = student_detail.filter(campus_id__name=pk2)

        serialized_student_detail = studentSerializer(student_detail, many=True)
        return Response(serialized_student_detail.data)

希望这是你想要的.

标签:python,django,django-urls
来源: https://codeday.me/bug/20190703/1363634.html