簡體   English   中英

在 django 中的 url 中發送參數

[英]send parameters in url in django

我有 2 個模型:

class Tag(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name


class Question(models.Model):
     name = models.CharField(max_length=255)
     Tag_name = models.ManyToManyField(Tag)

     def __str__(self):
        return self.name

視圖.py

class 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)

網址.py

urlpatterns = [
    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 的問題並按名稱排序?

查詢字符串[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 這是因為ManyToManyField指的是零個、一個或多個標簽,而且它指的是標簽對象,而不是標簽的名稱。

注意:與其從頭開始實現一個視圖, ListAPIView看看ListAPIView類 [drf-doc]已經可以實現很多樣板代碼

如果要使用此 Url 向 Django 發送多個 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 的文章。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM