首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-queryset为每个field=foo获取一个对象

Django-queryset为每个field=foo获取一个对象
EN

Stack Overflow用户
提问于 2009-08-22 17:58:27
回答 4查看 3.6K关注 0票数 2

我有一个基本的FK给用户,叫它的所有者

代码语言:javascript
复制
class Baz(models.Model):

    owner = models.ForeignKeyField(User)


    ....
    ....

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-23 15:36:08

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

代码语言:javascript
复制
>>> d={}
>>> [d.setdefault(str(a.owner),a) for a in qs ]
>>> d.values()

返回对象列表,即每个所有者的最新列表。我真的对这个解决方案的可扩展性持保留态度。

票数 1
EN

Stack Overflow用户

发布于 2009-08-23 00:45:06

我认为问题是如何运行与此等效的代码:

代码语言:javascript
复制
SELECT * FROM myapp_baz GROUP BY owner_id;

这将为每个唯一的owner_id返回一行。

看起来这行得通:

代码语言:javascript
复制
qs = Baz.objects.all()
qs.query.group_by = ['owner_id']

# Seems to do the trick
print [item for item in qs]
票数 3
EN

Stack Overflow用户

发布于 2009-08-23 00:21:38

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

代码语言:javascript
复制
Baz.objects.values('owner').distinct()

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

代码语言:javascript
复制
Baz.objects.filter(pk__in=Baz.objects.values('owner').distinct())

上面的代码将执行子查询(至少在MySQL中),应该会给出预期的结果,但这不是检索结果的最有效方式。

最后,因为已经添加了聚合,所以您可以编写一个自定义聚合类,它将作为一种"Distinct“和简单的"GROUP BY”工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1316589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档