Django url中的多个pks

时间:2016-03-24 05:25:59

标签: python regex django django-rest-framework

我目前正在尝试使用Django Rest Framework构建API。目前我希望能够在一个网址中包含多个pk,但是当我尝试时会出现错误:

  

django.core.exceptions.ImproperlyConfigured:   “^ video /(?P [0-9] +)/ quiz /(?P [0-9] +)/ list / $”无效   正则表达式:将组名'pk'重新定义为组2;是   第31组第1组

以下是我的网址:

url(r'^video/(?P<pk>[0-9]+)/quiz/(?P<pk>[0-9]+)/list/$',
        views.QuizList.as_view(),
        name='quizzes-list'),
url(r'^video/(?P<pk>[0-9]+)/quiz/(?P<pk>[0-9]+)/detail/$',
        views.QuizDetail.as_view(),
        name='quizzes-detail'),

我将对视频进行多次测验,并希望能够通过我的网址中的某个pk与他们联系。

有没有一种简单的方法可以做到这一点,或者错过了正确的方法来做到这一点?

谢谢

编辑*以下是我的观点:

class VideoList(generics.ListCreateAPIView):
    queryset = Video.objects.all()
    serializer_class = VideoSerializer


class VideoDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Video.objects.all()
    serializer_class = VideoSerializer


# quiz
class QuizList(generics.ListCreateAPIView):
    queryset = Quizzes.objects.all()
    serializer_class = QuizSerializer


class QuizDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Quizzes.objects.all()
    serializer_class = QuizSerializer

更新了网址:

    ###
    # Quiz urls
    ###

    url(r'^video/(?P<pk1>[0-9]+)/quiz/(?P<pk2>[0-9]+)/list/$',
        views.QuizList.as_view(),
        name='quizzes-list'),
    url(r'^video/(?P<pk1>[0-9]+)/quiz/(?P<pk2>[0-9]+)/detail/$',
        views.QuizDetail.as_view(),
        name='quizzes-detail'),

更新了观点:

class QuizList(generics.ListCreateAPIView):
    queryset = Quizzes.objects.all()
    serializer_class = QuizSerializer

    def get(self, request, *args, **kwargs):
        pk1 = kwargs.get('pk1', None)
        pk2 = kwargs.get('pk2', None)
        print(pk1)
        print(pk2)
        return self.list(request, *args, **kwargs)

新错误:

  

无法使用视图名称解析超链接关系的URL   “测验列表”。您可能未能在其中包含相关模型   您的API,或者lookup_field属性配置不正确   这个领域。

1 个答案:

答案 0 :(得分:3)

您必须为命名捕获组提供唯一名称。

url(r'^video/(?P<pk1>[0-9]+)/quiz/(?P<pk2>[0-9]+)/list/$',
    views.QuizList.as_view(),
    name='quizzes-list'),

访问视图中的相应pk*值,

pk1 = kwargs.get('pk1', None)
pk2 = kwargs.get('pk2', None)

例如:

# quiz
class QuizList(generics.ListCreateAPIView):
    queryset = Quizzes.objects.all()
    serializer_class = QuizSerializer

    def get(self, *args, **kwargs):
        pk1 = kwargs.get('pk1', None)
        pk2 = kwargs.get('pk2', None)
        print pk1
        print pk2
        return super(QuizList, self).get(*args, **kwargs)