[英]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]已經可以實現很多樣板代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.