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