Django ReadOnlyModelViewSet:get_querySet被pk过滤

时间:2016-04-20 20:58:45

标签: django django-rest-framework

我有一个端点,使用url kwargs,我想过滤并返回一个querySet,如下所示:/ api / myendpoint / {id} /应返回所有myendpoint对象,其字段X与{id}匹配。我在我的视图类中提供了get_query_set方法,它是一个ReadOnlyModelViewSet,它返回一个包含符合条件的所有对象的查询集(这部分我知道有效,因为我在返回之前打印出结果并且看起来正确)。 / p>

我似乎遇到的问题是,get_queryset返回的查询集似乎在被显示在端点上之前再次被django过滤掉了。它被过滤,使得pk == {id}。这不是我想要的功能,因为我使用{id}来过滤不同的字段。它似乎被视为DetailView,但我希望它被视为集合视图(如果存在这样的东西)。如何在仍然使用url kwargs的情况下为此视图返回多个对象?我是django初学者,很抱歉,如果这很明显。

urls.py:

  from rest_framework_nested_import routers
  router = routers.DefaultRouter()
  router.register(r'', MyView, base_name='myendpoint')

   urlpatterns = patterns('',
                  url(r'^', include(router.urls)))

views.py:

 class MyView(viewsets.ReadOnlyModelViewSet):

 def get_queryset(self):
       if 'pk' in self.kwargs:
            return MyObj.objects.filter(field=self.kwargs['pk'])

1 个答案:

答案 0 :(得分:1)

对于返回集合,您不应该传递/{pk}/,因为那样会尝试获取具有该ID的单个对象,您已经看到了。

您应该使用正确的URL来获取对象列表/api/myendpoint/。您可以使用queryset属性或get_queryset函数过滤对象列表。但是,我们仍然需要让django知道要过滤的字段和值。

filtering by query parameter所在的位置。您也可以在网址字符串中进行过滤,但由于您需要修改路由器网址,因此它会更复杂。

class MyView(viewsets.ReadOnlyModelViewSet):

    def get_queryset(self):
        queryset = MyObj.objects.all()
        filter_value = self.request.query_params.get('field_name', None)
        if filter_value is not None:
            queryset = queryset.filter(field_name=filter_value)
        return queryset

使用此代码,您可以点击/api/myendpoint/?field_name=somevalue,它将返回某个值的MyObj模型过滤field_name的查询集。

相关问题