在具有ManyToMany字段的QuerySet上输出values()



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

目前,使用.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值。有更好的方法吗?如果没有,这会是非常低效的吗?

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'}]

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

Django的文档警告不要在"ManyToManyField"上使用"values()"。

它不会是

效率极低的

如果这样做,那么多对多字段的所有值:Django

您可以使用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)]

最新更新