通过主键以外的字段获取对象 [英] Get object by field other than primary key
问题描述
-
myserver:8000 / videos
返回所有视频的列表。 >
-
myserver:8000 / videos / 1
返回主键为1的视频
我想做的是:
-
myserver:8000 / videos /:videoname
返回视频,其中videoname = videoname
我有以下视频模型:
类视频(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',nam espace ='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错误。
任何帮助?
所以我想出来了。发生了什么是
router.register(r'videos',views.VideosViewSet)
正在处理 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)
这个文档页面对URL进行过滤帮助我整理了发生了什么。
Hi I'm new to both Django and the Django-Rest-Framework. I've gone through the tutorials. What I'm trying to do (as a learning exercise) is return an object based off a field other than the primary key.
myserver:8000/videos
returns a list of all videos.myserver:8000/videos/1
returns the video with primary key of 1
What I would like to do is:
myserver:8000/videos/:videoname
returns the video wherevideoname = videoname
I have the following Videos model:
class Videos (models.Model):
videoID = models.IntegerField(blank=True, null=True)
videoName = models.CharField(max_length=20)
class Meta:
app_label="quickstart"
My router is configured as:
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)
)
And my view is defined as:
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
The api runs but when I hit: myserver:8000/videos/SecondVideo/
(where "SecondVideo" is the name of the video) I get a 404 error.
Any help?
So I figured it out. What was going on was the
router.register(r'videos', views.VideosViewSet)
Was handling myserver:8000/videos/1
and so my a new url pattern url(r'^videos/(?P<videoName>.+)/$', views.VideoDetailView.as_view())
was being overridden by the registered route. The code that works is:
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)
This documentation page on filtering against the URL helped me piece together what was going on.
这篇关于通过主键以外的字段获取对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!