2 回答
TA贡献1802条经验 获得超4个赞
查询字符串[wiki]不是路径的一部分。这些参数可以在request.GET对象中获取,对象是类字典对象。
因此,您的路径应如下所示:
path('/', views.QuestionListView.as_view()),
在您的QuestionListView中,您可以过滤这些参数:
class QuestionListView(ListAPIView):
model = Question
serializers = QuestionSerializers
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
if 'tag' in self.request.GET:
queryset = queryset.filter(
Tag_name=self.request.GET['tag']
)
if 'order_by' in self.request.GET:
queryset = queryset.order_by(self.request.GET['order_by'])
return queryset
# …
话虽这么说,以上将需要额外的脚手架。在这里,您允许用户在.order_by(..). 黑客可以利用这一点,例如通过对相关数据的元素进行排序,从而对某些字段进行二进制搜索。
可能值得一看django-filter[GitHub],您可以在其中根据可以过滤的元素进行定义等。它还将封装过滤,从而方便在不同的视图中使用它。
注意:通常 Django 模型中的字段名称是用 snake_case 编写的,而不是PerlCase,所以它应该是:tags而不是Tag_name. 这是因为 aManyToManyField指的是零个、一个或多个标签,而且它指的是标签对象,而不是标签的名称。
注意:与其从头开始实现视图,不如看看 已经可以实现大量样板代码的ListAPIView类 [drf-doc]。
添加回答
举报