按主键以外的字段获取对象

rac*_*mup 9 django django-rest-framework

嗨,我是Django和Django-Rest-Framework的新手.我已经完成了教程.我正在尝试做的(作为学习练习)是返回一个基于主键以外的字段的对象.

  • myserver:8000/videos 返回所有视频的列表.
  • myserver:8000/videos/1 返回主键为1的视频

我想做的是:

  • myserver:8000/videos/:videoname 将视频返回到哪里 videoname = videoname

我有以下视频模型:

class Videos (models.Model):
    videoID = models.IntegerField(blank=True, null=True)
    videoName = models.CharField(max_length=20)
    class Meta:
        app_label="quickstart"
Run Code Online (Sandbox Code Playgroud)

我的路由器配置为:

video_detail = views.VideoDetailView.as_view({
    'get':'list'
})

urlpatterns = patterns('',
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url(r'^videos/(?P<videoName>[^/]+)/$', video_detail)
)
Run Code Online (Sandbox Code Playgroud)

我的观点定义为:

class VideoDetailView(viewsets.ModelViewSet):
    serializer_class = VideosSerializer
    def get_queryset(self):
        videoName = self.kwargs.get(videoName, None)
        queryset = super (VideoDetailView,self).get_queryset()
        if videoName:
            queryset = queryset.filter(videoName=videoName)
        return queryset
Run Code Online (Sandbox Code Playgroud)

api运行但是当我点击时:( myserver:8000/videos/SecondVideo/其中"SecondVideo"是视频的名称)我收到404错误.

有帮助吗?

Mik*_*ack 10

尝试lookup_field在视图类上设置属性.这是将用于查找单个模型实例的字段.它默认为'pk'但您可以将其更改为'videoName'.

class VideoDetailView(viewsets.ModelViewSet):
    serializer_class = VideosSerializer
    lookup_field = 'videoName'
Run Code Online (Sandbox Code Playgroud)


rac*_*mup 10

所以我明白了.发生的事情是

router.register(r'videos', views.VideosViewSet)
Run Code Online (Sandbox Code Playgroud)

正在处理myserver:8000/videos/1,所以我的新网址模式 url(r'^videos/(?P<videoName>.+)/$', views.VideoDetailView.as_view())被注册路线覆盖.有效的代码是:

urls.py

url(r'^video/(?P<videoName>.+)/$', views.VideoDetailView.as_view())

views.py

class VideoDetailView(generics.ListAPIView):
    serializer_class = VideosSerializer

    def get_queryset(self):
        videoName = self.kwargs['videoName']
        return Videos.objects.filter(videoName=videoName)
Run Code Online (Sandbox Code Playgroud)

这个关于URL过滤的文档页面帮助我拼凑了正在发生的事情.