2013-10-15 29 views
9

嗨我是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錯誤。

任何幫助?

回答

8

所以我想通了。事情原委是

router.register(r'videos', views.VideosViewSet) 

正在處理myserver:8000/videos/1所以我的一個新的URL模式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) 

documentation page關於對URL過濾幫我拼湊出了事情的原委。

10

嘗試在視圖類中設置lookup_field屬性。這是將用於查找單個模型實例的字段。它默認爲'pk',但您可以將其更改爲'videoName'

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

我繼續查詢的表和look_up_kwargs字段的字段,添加的lookup_field和我仍然獲得了404任何其他的想法?或者爲什麼這不起作用的原因? – rackhamup

+0

這對我來說一旦我得到了正確的URL。對於Django的新用戶,以下是您用來查看視頻的網址:videoName ='SecondVideo':http:// localhost:8000/videos/SecondVideo /?format = json – Luke

2

什麼只是這樣一個解決方案:

意見。PY

class VideoDetailView(generics.RetrieveAPIView): 
    serializer_class = VideosSerializer 
    lookup_field = 'videoName' 

推理: 你想要的DetailView,所以沒有必要ListViewRetriveAPIView

如果一些furthere操作將需要只是覆蓋get_object方法是這樣的:

def get_object(self): 
    obj = super(VideoDetailView, self).get_object() 
    # perform some extra checks on obj, e.g custom permissions 
    return obj 
0

信用證https://www.youtube.com/watch?v=dWZB_F32BDg

使用lookup_field定義用於在URL

url(r'^videos/(?P<videoName>[^/]+)/$', video_detail)

class VideoDetailView(viewsets.ModelViewSet): 
    serializer_class = VideosSerializer 
    queryset = Videos.objects.all() 
    lookup_field = 'videoName' 
    lookup_url_kwarg = 'videoName'