我有一个基本的FK给用户,称之为所有者
class Baz(models.Model):
owner = models.ForeignKeyField(User)
....
....
现在,有了一个Baz的查询集,是否有一些我可以链接的东西,每个所有者只能给我一个Baz?
答案 0 :(得分:3)
我认为问题是如何运行相当于:
SELECT * FROM myapp_baz GROUP BY owner_id;
每个唯一owner_id将返回一行。
看起来这就是诀窍:
qs = Baz.objects.all()
qs.query.group_by = ['owner_id']
# Seems to do the trick
print [item for item in qs]
答案 1 :(得分:2)
您真正想要的功能是GROUP BY。但是,Django通常不支持构建不直接输出模型实例的查询集。在这种情况下,您有两种方法:
Baz.objects.values('owner').distinct()
这将使每个不同的所有者,但不是Baz对象本身。
Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())
上面将执行一个子查询(至少在MySQL中)并且应该给出预期的结果,但不是检索它的最有效方法。
最后,由于已经添加了聚合,因此您可以编写一个自定义聚合类,它可以作为一种“Distinct”和“GROUP BY”。
答案 2 :(得分:1)
这可能不是最好的解决方案(希望将其保留在内存和查询集中)但是:
>>> d={}
>>> [d.setdefault(str(a.owner),a) for a in qs ]
>>> d.values()
会返回一个对象列表,每个所有者的最新对象。我对这个解决方案的可扩展性有实际保留意见。
答案 3 :(得分:0)
编辑:这有更高的工作机会:
CheckIn.objects.extra(where=['checkins_checkin.id = (SELECT MAX(checkins_checkin.id) FROM checkins_checkin temp, auth_user WHERE auth_user.id = temp.id AND temp.user_id = checkins_checkin.user_id)',]).count()