我有一个端点,使用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'])
答案 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的查询集。