为了账号安全,请及时绑定邮箱和手机立即绑定

在 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 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信