2

すべてのユーザーが複数の画像を持つことができるユーザーと画像の間に関係があります。特定のユーザーのすべての画像を取得するエンドポイントを定義する必要があります。

GET /users/:id/images

私はこのようにしました:

urls.py

router = routers.DefaultRouter()
router.register(r'images', ImageViewSet)

image_list = ImageViewSet.as_view({
    'get': 'list'
})

urlpatterns = patterns('',
    ...
    url(r'^', include(router.urls)),
    url(r'^users/(?P<user_id>[^/]+)/images/$', image_list),
    ...
)

画像/views.py

class ImageViewSet(viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer

    def get_queryset(self):
        user_id = self.kwargs.get('user_id', None)
        if user_id:
            return Image.objects.filter(user_id=user_id)
        return super(ImageViewSet, self).get_queryset()

それは機能しますが、私はそれに満足していません。に類似した追加のエンドポイントをいくつか想像してみてください。つまり、 など/users/:user_id/images/のラインに沿ったものです。これらの両方のエントリポイントとして、 に基づいてそれらを区別できるようにすることは、あまり魅力的ではないようです。それを行うより良い方法はありますか?/categories/:category_id/images/get_querysetkwargs

4

2 に答える 2

2

in を使用super()get_queryset()て、フィルター処理されていないクエリ セットを取得し、kwargs.

if user_id:
    super(ImageViewSet, self).get_queryset().filter(user_id=user_id)

これが非常に一般的になり、各ビューに mixin として含めることができることに気付くでしょう。

class FilterByUserMixin(object):
    def get_queryset(self):
        user_id = self.kwargs.get('user_id', None)
        queryset = super(FilterByUserMixin, self).get_queryset()
        if user_id:
            queryset = queryset.filter(user_id=user_id)
        return querset


class ImageViewSet(FilterByUserMixin, viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer


class CategoryViewSet(FilterbyUserMixin, viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
于 2013-10-11T23:01:10.087 に答える