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

时间:2012-08-20 02:09:02

标签: django django-queryset django-orm

我目前正在将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值放在其中。有一个更好的方法吗?如果不是 - 这会非常低效吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

似乎没有其他方法可以迭代所有Task个对象。

Django关于在'ManyToManyField'上使用'values()'的文档warns

不会是

  

非常低效

如果你这样做All the values of the many to many field : Django