【问题标题】:Django Rest Framework: getting lists from query_params without request.getlistDjango Rest Framework:从没有 request.getlist 的 query_params 获取列表
【发布时间】:2016-02-11 23:53:13
【问题描述】:

我们使用序列化程序来验证进入我们的非基于模型的服务方法的数据。这当然适用于作为 JSON 的 POST,但如果 query_params 中的内容不复杂(不是列表或嵌套),通常也适用于 GET。但是,如果我有这样的事情:

class RequestSerializer(Serializer):
   objects = ListField(child=PrimaryKeyRelatedField(queryset=Foo.objects.all()), allow_empty=False)
   choice = ChoiceField(choices=my_choices)

在客户端我只使用这样的 GET:

$.ajax({
   type: "GET",
   url: '...',
   data={
      "objects":[1,2,3],
      "choice":"mychoice"
      ...

如果我使用 POST 而不是 GET 并将 contentType 设置为“application/json”,则此方法有效,但 HTTP spec 不宽恕这种做法。能够处理简单的列表用例而不做类似的事情会很好:

request_serializer = RequestSerializer(data={"objects" :request.query_params.getlist("objects[]")})

我是否缺少一些明显的序列化程序技巧,告诉序列化程序如何在不手动调用 request.getlist 的情况下获取列表(objects=x&objects=y&objects=z)?其他人为此做了什么,这似乎是一个常见的用例?

编辑: 我之前确实找到了this post,但接受的答案是使用 request.getlist 这不是我想要的。

【问题讨论】:

    标签: json django http django-rest-framework


    【解决方案1】:

    不完全确定您的问题是什么,但似乎您应该对该字段使用 many 参数:

    class RequestSerializer(Serializer):
        objects = PrimaryKeyRelatedField(queryset=Foo.objects.all(), allow_empty=False, many=True)
        choice = ChoiceField(choices=my_choices)
    

    【讨论】:

    • 是的,我们在其他地方使用 many。 ListSerializer 也可以工作。问题是关于从 query_params(不是 request.data)获取列表。
    【解决方案2】:

    答案是使用jQuery ajaxSettings

    $.ajaxSettings.traditional = true;
    

    如果您在模板中使用 jQuery,并且根据我正在阅读的内容,它可能应该用于使用 Django 的整个项目,因为它似乎没有受到与其他语言相同的限制。

    从 jQuery 1.4 开始,$.param() 方法序列化深层对象 递归地适应现代脚本语言和框架 例如 PHP 和 Ruby on Rails。

    保留此 false 会导致变量以“objects[]”的形式出现,并且处理 ListField 中的 HTML 列表的代码永远不会被调用,因为参数已被替换。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多