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]。
添加回答
舉報