通过主键以外的字段获取对象 [英] Get object by field other than primary key

查看:114
本文介绍了通过主键以外的字段获取对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚接触Django和Django-Rest-Framework。我已经通过了教程。我想做的(作为一个学习练习)返回一个基于主键以外的字段的对象。




  • 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 where videoname = 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆