嗨,我是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"
    

    我的路由器配置为:
    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)
    )
    

    我的观点定义为:
    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
    

    该API可以运行,但是当我点击:myserver:8000/videos/SecondVideo/(其中“SecondVideo”是视频的名称)时,出现404错误。

    有什么帮助吗?

    最佳答案

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

    class VideoDetailView(viewsets.ModelViewSet):
        serializer_class = VideosSerializer
        lookup_field = 'videoName'
    

    09-25 19:26