我有 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
View .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)
url.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 的问题并按名称排序?
最佳答案
query string [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(
<b>Tag_name=self.request.GET['tag']</b>
)
if 'order_by' in self.request.GET:
queryset = queryset.order_by(<b>self.request.GET['order_by']</b>)
return queryset
# …
话虽如此,上述内容将需要额外的脚手架。在这里,您允许用户在 .order_by(..)
中“注入(inject)”项目。黑客可以利用这一点,例如对相关数据上的元素进行排序,从而在某些字段上进行二进制搜索。
可能值得一看 django-filter
[GitHub] ,您可以在其中定义您可以过滤哪些元素等。它将进一步封装过滤,从而方便在不同 View 中使用它。
Note: normally the name of the fields in a Django model are written in snake_case, not PerlCase, so it should be:
tags
instead of. This because aTag_name
ManyToManyField
refers to zero, one or more tags, and furthermore it refers to tag objects, not the name of the tags.
Note: Instead of implementing a view from scratch, it might be worth taking a look at the
ListAPIView
class [drf-doc] that can already implement a lot of boilerplate code.
关于python - 在django中发送url中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59947578/