2

我对用户有一个基本的 FK,称它为所有者

class Baz(models.Model):

    owner = models.ForeignKeyField(User)


    ....
    ....

现在,有了一个 Baz 的查询集,有没有可以链接的东西,每个所有者只给我一个 Baz?

4

4 回答 4

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]
于 2009-08-23T00:45:05.670 回答
2

您真正需要的功能是 GROUP BY。但是,Django 通常不支持构建不直接输出模型实例的查询集。在这种情况下,您有两种方法:

Baz.objects.values('owner').distinct()

这将使您获得每个不同的所有者,而不是 Baz 对象本身。

Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())

上面将执行一个子查询(至少在 MySQL 中)并且应该给出预期的结果,但不是检索它的最有效方法。

最后,由于已经添加了聚合,您可以编写一个自定义聚合类,它可以作为一种“不同的”并且只是“GROUP BY”。

于 2009-08-23T00:21:38.383 回答
1

这可能不是最好的解决方案(希望将其保留在内存之外和查询集中),但是:

>>> d={}
>>> [d.setdefault(str(a.owner),a) for a in qs ]
>>> d.values()

确实返回一个对象列表,每个所有者的最新对象。我对这个解决方案的可扩展性有真正的保留。

于 2009-08-23T15:36:07.607 回答
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() 
于 2009-08-22T18:40:17.407 回答