【发布时间】:2015-08-29 23:23:14
【问题描述】:
我正在使用带有 rest 框架的 django,并且我正在尝试使用通用过滤器后端。 我的观点是这样的:
class Agents(generics.ListAPIView):
serializer_class = serializer.AgentSerializer
model = serializer_class.Meta.model
filter_backends = (filters.DjangoFilterBackend,)
queryset = models.Agent.objects.all()
filter_fields = ('available', 'online', 'agency')
我添加了以下网址:
url('^api/agents/$', api_views.Agents.as_view()),
现在当我输入这样的网址时:
api/agents/?online=False
api/agents/?available=True
它可以工作,它会根据过滤器返回一个正确的列表。但是,当我尝试这个时:
api/agents/123/?online=False
找不到页面。
阅读this doc 告诉我,当我使用通用过滤器时,它也适用于返回单个对象,他们以以下 URL 为例: http://example.com/api/products/4675/?category=clothing&max_price=10.00
但我不明白我是否应该专门创建自己的 URL 来通过 id 获取单个对象?还是假设它会自动发生?我应该实现一个 get_queryset() 从 URL 获取参数并返回所有对象或特定对象,并有两个使用相同视图的 url?
文档对此不是很清楚。
谢谢!
【问题讨论】:
-
如果您使用viewsets,那么您可以使用
DefaultRouter或SimpleRouter自动配置您的列表和详细端点的url。否则,您将不得不手动提供这些视图和 urlpatterns。 -
哦,太好了,谢谢。以及如何实现 get_queryset()?我是否需要实现它并在有和没有参数的情况下处理案例?还是它也会自动发生?我缺少的是泛型的完整示例。ListAPIView + 获取单个对象 + 过滤器以查看它们如何连接..
-
尼斯,使用
DefaultRouter或SimpleRouter就足够了。您无需实现get_queryset()即可获得此行为。
标签: django django-rest-framework