使用Django中的值从包含许多字段的queryset中提取智能列表
我基本上有这个模型:使用Django中的值从包含许多字段的queryset中提取智能列表,django,orm,many-to-many,Django,Orm,Many To Many,我基本上有这个模型: class MyModel(models.Model): uid = models.CharField() m2m = models.ManyToManyField(AnotherModel) class AnotherModel(models.Model): name = models.CharField() lang = models.CharField() 我想得到一个这样的口述列表(当然可能是过滤,但效果很好): 如果我这样做:
class MyModel(models.Model):
uid = models.CharField()
m2m = models.ManyToManyField(AnotherModel)
class AnotherModel(models.Model):
name = models.CharField()
lang = models.CharField()
我想得到一个这样的口述列表(当然可能是过滤,但效果很好):
如果我这样做:
MyModel.objects.select_related('m2m').filter().values('uid', 'm2m__name')
我得到以下信息:
[{
'uid': name_1,
'm2m__name': m2m_1.name
},{
'uid': name_1,
'm2m__name': m2m_2.name
}]
MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
<MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
我有两个问题:
m2m\uu name
并且只使用m2m
我不会得到unicode而是ID)
有没有一种方法可以直接在queryset中解决这些问题,而不必经过python循环?最有效的方法是什么
编辑
…也许使用.raw()或.extra()和一些自烘焙SQL至少可以解决问题2
my_list = {}
for item in items:
_uid = item['uid']
_name = item['m2m__name']
list_item = my_list.get(, {'uid': _uid, 'name': set([_name])})
list_item['name'].add(_name)
这将导致如下结果:
my_list = { 'uid': {
'uid': uid,
'm2m': [m2m.name, m2m.name, ...]
}}
哪些项目正是问题中需要的
我本来希望能够在QuerySet级别解决至少一个问题,但…我自己也有这个问题,必须将多个信息拼凑在一起才能得到答案。对其他人来说,这就是我的发现。这仅在使用Postgres>=9.4和Django>=9.0时有效 您可以执行以下操作:
[{
'uid': name_1,
'm2m__name': m2m_1.name
},{
'uid': name_1,
'm2m__name': m2m_2.name
}]
MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
<MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
将产生以下结果:
[{
'uid': name_1,
'm2m__name': m2m_1.name
},{
'uid': name_1,
'm2m__name': m2m_2.name
}]
MyModel.objects.filter( ... ).values('uid', names=ArrayAgg('m2m__name'))
<MyModelQuerySet [{'uid': 'id_1', 'names': ['name_1', 'name_2', ...]}]>
快点!我不想接受我自己的答案!!!:)一定有更好的解决办法。。。