Django URL中有多个pk [英] Django multiple pks in url

查看:114
本文介绍了Django URL中有多个pk的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am currently trying to build an API using the Django Rest Framework. Currently I want to be able to have multiple pks in a single url, but when I try I get an error:

django.core.exceptions.ImproperlyConfiged:"^ video/(?P [0-9] +)/测验/(?P [0-9] +)/列表/$"无效正则表达式:将组名"pk"重新定义为组2;曾是第1组第31位

django.core.exceptions.ImproperlyConfigured: "^video/(?P[0-9]+)/quiz/(?P[0-9]+)/list/$" is not a valid regular expression: redefinition of group name 'pk' as group 2; was group 1 at position 31

这是我的网址:

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到达这些测验.

I am going to have multiple quizzes for a video and want to be able to reach them through a certain pk in my url.

是否有一种简单的方法可以执行此操作,或者缺少正确的方法来执行此操作?

Is there a simple method to do this or am missing the proper way to do this?

谢谢

编辑*这是我的观点:

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 属性配置为此字段.

推荐答案

您必须为命名"捕获组指定一个唯一的名称.

You must give a unique name for the Named capturing group.

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

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

Access the corresponding pk* values in the view through,

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)

这篇关于Django URL中有多个pk的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆