Database Django queryset每个字段获取一个对象=foo

Database Django queryset每个字段获取一个对象=foo,database,django,api,django-queryset,Database,Django,Api,Django Queryset,我有一个基本的FK到用户,称之为所有者 class Baz(models.Model): owner = models.ForeignKeyField(User) .... .... 现在,有了Baz的查询集,我是否可以链接一些东西,让每个所有者只给我一个Baz?编辑:这有更高的工作机会: CheckIn.objects.extra(where=['checkins_checkin.id = (SELECT MAX(checkins_checkin.id) FRO

我有一个基本的FK到用户,称之为所有者

class Baz(models.Model):

    owner = models.ForeignKeyField(User)


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

编辑:这有更高的工作机会:

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() 

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

Baz.objects.values('owner').distinct()
这将为您确定每个不同的所有者,而不是Baz对象本身

Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())
以上内容将至少在MySQL中执行子查询,并应给出预期的结果,但这不是检索它的最有效方法


最后,由于已经添加了聚合,您可以编写一个自定义聚合类,该类将作为一种独特的、简单的分组方式工作。

我认为问题在于如何运行此类的等效程序:

SELECT * FROM myapp_baz GROUP BY owner_id;
它将为每个唯一的所有者id返回一行

看起来这确实起到了作用:

qs = Baz.objects.all()
qs.query.group_by = ['owner_id']

# Seems to do the trick
print [item for item in qs]

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

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

返回对象列表,每个所有者的最新对象。我对这个解决方案的可伸缩性有保留意见。

因此,给定一个Baz的QuerySet,您希望对其进行过滤,以便QuerySet返回的两个对象没有与所有者相同的User对象。这就是你想要的吗?听起来你有ideaCheckIn.objects.extrawhere=['checkins\u checkin.id=从checkins\u checkin temp中选择checkins\u checkin.id,auth\u user WHERE auth\u user.id=temp.id按id顺序描述限制1',]计数[4]:18 In[5]:checkin.objects.all.count Out[5]:18此测试数据集中只有2个所有者,但我通过该查询返回了所有18个对象。没错,我忘了在where子句中添加用户条件。我相应地更新了我的答案。似乎如此接近,我将进一步研究。列app_baz.X必须出现在GROUP BY子句中或在聚合函数中使用。能否提供代码段?在我的示例中,“owner\u id”是数据库中的一列,如果Baz对象的owner=ForeignKeySomeObject,那么您也应该有一个owner\u id列。owner\u id是一列,我得到了编程错误:column checkins\u checkin.id必须出现在GROUP BY子句中,或者用于聚合函数checkins\u checkin.id是主键。。但是,如果我将其添加到group_by列表中,那么它将继续在nex字段中出现相同的错误。是我们正在使用的签入模型,还是另一个fk?另外,fwiw,我在这里使用Django 1.1;本页上的其他项目与发生订购的情况有关…我建议使用此解决方案,然后在出现问题时对其进行优化,可能会记下笔记,以便稍后返回并修复。谢谢,我也在使用此解决方案,尽管我讨厌它。如果你确实改进了这段代码,你能发布你的改进吗?啊,子查询不太正确,请使用下面显示的组。