我查询一个模型:
Members.objects.all()
它返回:
Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop
我想要的是知道Django最好的点火方式
对我的数据库进行group_by查询,如:
Members.objects.all().group_by('designation')
当然,这是行不通的。
我知道我们可以在django/db/models/query.py上做一些技巧,但我只是好奇如何不打补丁就能做到。
文档说您可以使用值来对查询集进行分组。
class Travel(models.Model):
interest = models.ForeignKey(Interest)
user = models.ForeignKey(User)
time = models.DateTimeField(auto_now_add=True)
# Find the travel and group by the interest:
>>> Travel.objects.values('interest').annotate(Count('user'))
<QuerySet [{'interest': 5, 'user__count': 2}, {'interest': 6, 'user__count': 1}]>
# the interest(id=5) had been visited for 2 times,
# and the interest(id=6) had only been visited for 1 time.
>>> Travel.objects.values('interest').annotate(Count('user', distinct=True))
<QuerySet [{'interest': 5, 'user__count': 1}, {'interest': 6, 'user__count': 1}]>
# the interest(id=5) had been visited by only one person (but this person had
# visited the interest for 2 times
你可以找到所有的书,并按名字分组:
Book.objects.values('name').annotate(Count('id')).order_by() # ensure you add the order_by()
你可以在这里看一些小抄。
你也可以使用python内置的itertools。groupby直接:
from itertools import groupby
designation_key_func = lambda member: member.designation
queryset = Members.objects.all().select_related("designation")
for designation, member_group in groupby(queryset, designation_key_func):
print(f"{designation} : {list(member_group)}")
不需要原始sql、子查询、第三方库或模板标签,在我看来是python化的和显式的。
一个简单的解决方案,但不是正确的方法是使用原始SQL:
results = Members.objects.raw('SELECT * FROM myapp_members GROUP BY designation')
另一个解决方案是使用group_by属性:
query = Members.objects.all().query
query.group_by = ['designation']
results = QuerySet(query=query, model=Members)
现在可以遍历结果变量以检索结果。请注意,group_by没有文档,在Django的未来版本中可能会被更改。
和…为什么要使用group_by?如果不使用聚合,可以使用order_by来实现类似的结果。