19

我目前正在将 QuerySet 的结果放入我的 js 前端使用的 JSON 字符串中。

目前这很容易使用 .values() 和 simplejson:

simplejson.dumps(list(Task.objects.filter(list=mylist).values()))

我现在在我的 Task 对象中添加了一个 ManyToMany 字段,希望将它包含在我的输出中,而不需要为 ManyToMany 关系的每个值重复每个 Task 对象。

如果我只是这样做Task.objects.filter(list=mylist).values('myManyToManyField', 'someOtherField') ,输出将为每个值都有一个单独的对象/行myManyToManyField

[{'myManyToManyField': 1, 'someOtherField': 'valueOne'}, 
{'myManyToManyField': 2, 'someOtherField': 'valueOne'},
{'myManyToManyField': 1, 'someOtherField': 'valueTwo'}]

有没有办法得到这个结果?:

[{'myManyToManyField': [1,2], 'someOtherField': 'valueOne'},
{'myManyToManyField': 1, 'someOtherField': 'valueTwo'}]

我现在唯一的解决方案是遍历所有Task对象并手动构建输出,根据需要将 ManyToMany 值放入其中。有一个更好的方法吗?如果不是 - 这会非常低效吗?

4

3 回答 3

3

似乎没有其他方法,只能遍历所有Task对象。

Django 的文档警告在“ManyToManyField”上使用“values()”。

它不会是

效率极低

如果你这样做多对多字段的所有值:Django

于 2015-10-21T08:07:04.353 回答
3

您可以使用 Django 的序列化程序:

import json
from django.core import serializers

json_data = serializers.serialize("json", Task.objects.all())

如果您只想提取字段,请执行以下操作:

data = [i['fields'] for i in json.loads(json_data)]
于 2018-08-23T09:46:58.447 回答
2
from django.contrib.postgres.aggregates import ArrayAgg

Task.objects.filter(list=mylist).annotate(arr_field=ArrayAgg('myManyToManyField')).values('arr_field', 'someOtherField')

输出:

[{'arr_field': [1,2], 'someOtherField': 'valueOne'},
 {'arr_field': 1, 'someOtherField': 'valueTwo'}]
于 2021-10-05T08:48:10.727 回答