2017-08-09 81 views
0

我想检索模型的每个对象只有他们的id和他们在多对多字段中的id列表。Queryset过滤器:检索manytomany字段作为每个对象的列表

我的模型:

class Wordlist(models.Model): 
    words = models.ManyToManyField(Word) 


class Word(models.Model): 
    word = models.CharField(max_length=256) 

我有这样的代码:

list(Wordlist.objects.all().annotate(w=F('words')).values_list('pk', 'w')) 

,这让我这个:

[{'pk': 1, 'w': 7}, 
{'pk': 1, 'w': 13}, 
{'pk': 1, 'w': 17}, 
{'pk': 2, 'w': 29}, 
{'pk': 1, 'w': 42}, 
{'pk': 3, 'w': 52}, 
{'pk': 2, 'w': 65} 
... 
] 

我要的是:

[{'pk': 1, 'w': [7, 13, 17, 42,...]}, 
{'pk': 2, 'w': [29, 65,...]}, 
{'pk': 3, 'w': [52,...]}, 
... 
] 

一个简单的解决方案就是根据他们的ID来结合这些词典,但我认为这不是一个好的做法,而且效率很高,因为我们可能会有数十万个词典。

此外,我想知道是否有可能做一个单一的请求相反;检索Wordlist的列表中的每个字在Word上的请求中。

回答

2

如果您使用PostgreSQL,则可以使用在django.contrib.postgres包中实现的array_agg函数。您的查询将如下所示:

from django.contrib.postgres.aggregates.general import ArrayAgg 

Wordlist.objects.annotate(arr=ArrayAgg('words')).values_list('id', 'arr') 
+0

我的确使用PostgresSQL,我以前从未遇到过这个问题,这真的很有用,谢谢。 – Qrom

相关问题