url中的Django多个pks

Posted

技术标签:

【中文标题】url中的Django多个pks【英文标题】:Django multiple pks in url 【发布时间】:2016-07-11 15:58:36 【问题描述】:

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

django.core.exceptions.ImproperlyConfigured: "^video/(?P[0-9]+)/quiz/(?P[0-9]+)/list/$" 无效 正则表达式:将组名“pk”重新定义为组 2;曾是 第 1 组在第 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 联系到他们。

是否有一种简单的方法可以做到这一点,或者我缺少正确的方法来做到这一点?

谢谢

编辑* 以下是我的观点:

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】:

您必须为命名捕获组指定一个唯一名称。

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)

【讨论】:

我还是不明白。我是新手。我发表了我的看法。我将如何为他们实现相应的 pk*? 我更新了所有内容,但现在收到了我在上面发布的新错误。我对这个错误感到困惑,因为 'quizzes-list' 列在 url 名称中,而我没有 lookup_field。有什么方向吗?感谢所有帮助。 @Ryan113 看看***.com/questions/20550598/…

以上是关于url中的Django多个pks的主要内容,如果未能解决你的问题,请参考以下文章

获取 Django url 正则表达式中的多个参数

URLS 问题中的 Django 双斜杠(多个 Web 服务器、Apache 和 Nginx)

Django:视图如何从 url 获取多个值?

一个 Django 视图和 url,多个应用程序

在 Django 中处理来自 URL 的多个参数

django 注册 redux URL 受具有多个查询参数的 url 影响