gpt4 book ai didi

django - 最佳 django manytomany 查询

转载 作者:行者123 更新时间:2023-12-04 04:34:56 26 4
gpt4 key购买 nike

我在减少特定 View 的查询数量时遇到问题。这是一个相当沉重的,但我相信它可以减少:

Profile:
name = CharField()

Officers:
club= ManyToManyField(Club, related_name='officers')
title= CharField()

Club:
name = CharField()
members = ManyToManyField(Profile)

Election:
club = ForeignKey(Club)
elected = ForeignKey(Profile)
title= CharField()
when = DateTimeField()

俱乐部有成员(member)和官员(主席、赛事总监)。人们可以是多个俱乐部的成员等...
官员在选举中选出,选举结果被存储。

Given a player how can I find out the most recently elected officer at each of the players clubs?

目前我有
clubs = Club.objects.filter(members=me).prefetch_related('officers')
for c in clubs:
officers = c.officers.all()

most_recent = Elections.objects.filter(club=c).filter(elected__in=officers).order_by('-when')[:1].get()
print(c.name + ' elected ' + most_recent.name + ' most recently')

问题是循环查询,如果您是 1 家具乐部的成员,它既好又快,但如果您加入 50 我的数据库爬行。

编辑:
来自 Nil 的答案做了我想要的但没有得到对象。我并不真正需要该对象,但我确实需要另一个字段以及日期时间。如果它有帮助查询:
Club.objects.annotate(last_election=Max('election__when'))

生成原始 SQL
SELECT "organisation_club"."id", "organisation_club"."name", MAX("organisation_election"."when") AS "last_election" 
FROM "organisation_club"
LEFT OUTER JOIN "organisation_election" ON ( "organisation_club"."id" = "organisation_election"."club_id" )
GROUP BY "organisation_club"."id", "organisation_club"."name"

如果可能的话,我真的很喜欢 ORM 答案(或“主要是”ORM 答案)。

最佳答案

我相信这就是你要找的:

from django.db.models import Max, F

Election.objects.filter(club__members=me) \
.annotate(max_date=Max('club__election_set__when')) \
.filter(when=F('max_date')).select_related('elected')

可以在单个语句中再次向前和向后跟踪关系,允许您注释与当前选举俱乐部相关的任何选举的 max_date。 F class 允许您根据 SQL 中的选定字段过滤查询集,包括通过注释、聚合、连接等添加的任何额外字段。

关于django - 最佳 django manytomany 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22278203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com