python - 在django中发送url中的参数

标签 python django django-models django-rest-framework django-forms

我有 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 Tag_name. This because a 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/

相关文章:

python - 推荐使用多个 AWS 账户管理凭证的方法?

Python 导入错误 : No module named pygments

python - 以特定的 json 格式发送报告

django - 除了 super 用户,如何使字段在 django admin 中只读?

python - Django 测试显示导入错误,但项目通过运行服务器成功运行

python - 如何将互斥参数作为变量传递

django - 重新编译 Django 而不重新启动 Apache

django - ModelAdmin、外键关系链

python - 在 Django 选择表单的模型选择字段中列出各种模型属性

python - django模型字段检查实例