我们使用序列化程序来验证进入基于非模型的服务方法的数据。当然,如果query_params中的内容不复杂(不是列表或嵌套),这对于POST当然是JSON当然也适用于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[]")})
是否有一些明显的序列化器技巧我告诉序列化器如何获取列表(objects = x& objects = y& objects = z)而无需手动调用 request.getlist ?其他人为此做了什么,这似乎是一个常见的用例?
编辑: 我之前确实找到this post但接受的答案是使用 request.getlist ,这不是我想要的。
答案 0 :(得分:1)
不完全确定您的问题是什么,但似乎您应该在字段中使用many
参数:
class RequestSerializer(Serializer):
objects = PrimaryKeyRelatedField(queryset=Foo.objects.all(), allow_empty=False, many=True)
choice = ChoiceField(choices=my_choices)
答案 1 :(得分:1)
答案是使用jQuery ajaxSettings
$.ajaxSettings.traditional = true;
如果你在你的模板中使用jQuery,从我正在阅读的内容中,它应该可能用于使用Django的整个项目,因为它似乎没有与其他语言相同的限制。
从jQuery 1.4开始,$ .param()方法序列化深层对象 递归地适应现代脚本语言和框架 例如PHP和Ruby on Rails。
保留此false会导致变量以“objects []”的形式出现,而ListField中处理HTML列表的代码永远不会被调用,因为param已被替换。