亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 django 的 url 中發送參數

在 django 的 url 中發送參數

繁星coding 2022-07-12 15:45:12
我有 2 個模型:class Tag(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(max_length=255)    def __str__(self):        return self.nameclass Question(models.Model):     name = models.CharField(max_length=255)     Tag_name = models.ManyToManyField(Tag)     def __str__(self):        return self.nameviews.pyclass QuestionList(APIView):def get(self, request, tag_id):    res = Question.objects.filter(Tag_name=tag_id).prefetch_related('Tag_name').order_by('name')[:10]    print(res)    serializer = QuestionSerializers(res, many=True)    data = {}    return Response(serializer.data)    # return Response(data)urls.pyurlpatterns = [    path('admin/', admin.site.urls),    path('tag=<int:tag_id>/', views.QuestionList.as_view()) //this needs to be edited]url.py 文件中發送 id 和 name 參數并獲取數據的路徑是什么http://127.0.0.1:8000?tag=4&order_by=name所以我收到所有關于標簽 4 的問題并按名稱排序?
查看完整描述

2 回答

?
慕虎7371278

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]。


查看完整回答
反對 回復 2022-07-12
?
一只萌萌小番薯

TA貢獻1795條經驗 獲得超7個贊

如果您想使用 Django 使用此 Url 發送多個 Url 參數:

http://127.0.0.1:8000?tag=4&order_by=name

使用 urls.py 中的路徑試試這個:

path('tag=<int:tag_id>/order_by=<str:name>', views.QuestionList.as_view())

你在這里有一個很好的例子,Django 文檔或找到我的博客,里面有關于 Django 的文章。


查看完整回答
反對 回復 2022-07-12
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號