15

こんにちは、私は 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 エラーが発生します。

何か助けはありますか?

4

5 に答える 5

17

lookup_fieldビュークラスに属性を設定してみてください。これは、個々のモデル インスタンスを検索するために使用されるフィールドです。デフォルトでは に設定されて'pk'いますが、変更することができます'videoName'

class VideoDetailView(viewsets.ModelViewSet):
    serializer_class = VideosSerializer
    lookup_field = 'videoName'
于 2013-10-15T21:10:55.773 に答える
11

だから私はそれを理解しました。何が起こっていたかというと

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)

URL に対するフィルタリングに関するこのドキュメント ページは、何が起こっているのかをまとめるのに役立ちました。

于 2013-10-17T17:54:50.300 に答える
3

次のようなソリューションはどうでしょうか。

ビュー.py

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

理由: 詳細ビューが必要なため、必要はありませんがListViewRetriveAPIView

さらに操作が必要な場合は、次のget_objectようにメソッドをオーバーライドするだけです。

def get_object(self):
    obj = super(VideoDetailView, self).get_object()
    # perform some extra checks on obj, e.g custom permissions
    return obj
于 2016-01-07T10:44:50.327 に答える