在 django 的 url 中发送参数

我有 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

views.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)

urls.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 的问题并按名称排序?


繁星coding
浏览 140回答 2
2回答

慕虎7371278

查询字符串[wiki]不是路径的一部分。这些参数可以在request.GET对象中获取,对象是类字典对象。因此,您的路径应如下所示:path('/', views.QuestionListView.as_view()),在您的QuestionListView中,您可以过滤这些参数:class QuestionListView(ListAPIView):&nbsp; &nbsp; model = Question&nbsp; &nbsp; serializers = QuestionSerializers&nbsp; &nbsp; def get_queryset(self, *args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; queryset = super().get_queryset(*args, **kwargs)&nbsp; &nbsp; &nbsp; &nbsp; if 'tag' in self.request.GET:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queryset = queryset.filter(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Tag_name=self.request.GET['tag']&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; )&nbsp; &nbsp; &nbsp; &nbsp; if 'order_by' in self.request.GET:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; queryset = queryset.order_by(self.request.GET['order_by'])&nbsp; &nbsp; &nbsp; &nbsp; return queryset&nbsp; &nbsp; # …话虽这么说,以上将需要额外的脚手架。在这里,您允许用户在.order_by(..). 黑客可以利用这一点,例如通过对相关数据的元素进行排序,从而对某些字段进行二进制搜索。可能值得一看django-filter[GitHub],您可以在其中根据可以过滤的元素进行定义等。它还将封装过滤,从而方便在不同的视图中使用它。注意:通常 Django 模型中的字段名称是用 snake_case 编写的,而不是PerlCase,所以它应该是:tags而不是Tag_name. 这是因为 aManyToManyField指的是零个、一个或多个标签,而且它指的是标签对象,而不是标签的名称。&nbsp;注意:与其从头开始实现视图,不如看看 已经可以实现大量样板代码的ListAPIView类 [drf-doc]。

一只萌萌小番薯

如果您想使用 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>',&nbsp;views.QuestionList.as_view())你在这里有一个很好的例子,Django 文档或找到我的博客,里面有关于 Django 的文章。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python