- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
class Parent(BaseModel):
name = peewee.CharField()
class Child(BaseModel):
name = peewee.CharField()
parent = peewee.ForeignKeyField(Parent, related_name='children')
parent = Parent.create(name="Parent1")
child1 = Child.create(name="Child1", parent=parent)
chilld2 = Child.create(name="Child2", parent=parent)
query = (Parent.select()
.join(Child))
for p in query:
print p.name
for c in p.children:
print "\t",c.name
这会产生以下输出:
Parent1
Child1
Child2
Parent1
Child1
Child2
我预计会是这样:
Parent1
Child1
Child2
看起来我正在迭代 SQL 结果集,而不是 ORM 意义上的对象。鉴于查询中只有一个“父对象”,从 ORM 的角度来看,我如何修改查询或查询迭代以获得预期结果?
我想将查询返回到我的模板,就像在 peewee 示例应用程序中一样,然后迭代它以显示对象,但如果我这样做,它将显示相同的对象两次(或者 n 次相关子对象) )。
我知道我可以执行以下操作:
p = query.get()
print p.name
for c in p.children:
print "\t", c.name
但是当我有多个 parent 并且只想遍历所有 parent 时,我无法确定有多少个 parent 。查询的 count
方法返回结果集的计数,而不是父对象的数量。
这也是一种解决方法:
pars = []
for p in query:
if p not in pars:
pars.append(p)
for p in pars:
print p.name
for c in p.children:
print "\t", c.name
最佳答案
您的代码有两个问题。
首先,即使您已加入 Child
,调用 parent.children
也会执行额外的单独查询。
由于第一个问题,您错误地理解了外循环正在执行的操作,它只是为您提供了 Parent1+Child1、Parent1+Child2 的 Parent 部分。
要解决此问题,您可以使用 prefetch
或 aggregate_rows
:
# Execute a single query and de-dupe the duplicated parent rows.
query = Parent.select(Parent, Child).join(Child).aggregate_rows()
for parent in query:
print parent.name
for child in parent.children:
print childname
# Execute a query for each joined table. Generally more efficient
# than aggregate_rows().
query = prefetch(Parent.select(), Child)
for parent in query:
print parent.name
for child in parent.children_prefetch: # NOTE the `_prefetch`
print child.name
这已被广泛记录:http://docs.peewee-orm.com/en/latest/peewee/querying.html#avoiding-n-1-queries
关于python - Peewee 在内部联接期间返回多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29045154/
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我目前有这些表: CREATE TABLE #SECURITY_TEMP (ID CHAR(30)) CREATE TABLE #SECURITY_TEMP_PRICE_HISTORY (ID CHA
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我有一个如下所示的表格 表tbl_veh VIN Record DateChange 11223344 123A 6/24/2012 11223344
我的应用程序的数据模型 群组有很多用户 用户所属组 用户有很多打卡 冲床属于用户 冲床属于PayPeriod PayPeriod hasMany Punch 找电话 $groups = $this->
使用 Join 或 GroupJoin,是否有任何方法可以为父表和子表中的字段生成聚合值。给定一个 Orders 表和一个 OrderDetails 表,使用下面的 2 个步骤我可以从 Orders
我有一个包含用户 ID 和用户名的用户表。另一个表有一个兴趣列表,包括兴趣和姓名。第三个表是一个连接表,包含 userid 和interestid。 对于每对用户,我想获取他们共同兴趣的数量。我尝试了
假设我有下表: 表A a_name | age | country Jordan | 5 | Germany Molly | 6 | Spain Paris | 7 | France John | 7
数据源是 CSV 文件的集合,因此没有实际的数据库。这是与日本已有数十年历史的遗留系统的集成。 我有一个 c# 函数需要将 2 个 DataTables 和 2 个列名作为参数。我的函数需要对这两个数
我有一种情况要在具有数据的elasticsearch中编写搜索查询,如下所示 {id:"p1",person:{name:"name",age:"12"},relatedTO:{id:"p2"}} {
我想创建具有父子关系的文档。 我有如下数据 parent_id = null的父文档数据 { "id": 1, "work
我有以下按预期工作的 SQL: SELECT p.ACCT_ID AS [Acct], a.ACCT_NAME AS [AcctName], p.PD_NO AS [Period],
我想使用 CriteriaBuilder 在连接 2 个表的位置进行查询。在 MySQL 中,我尝试进行的查询如下所示: SELECT * FROM order LEFT JOIN item ON o
使用带有collection标签的域Service,如下所示: @Entity public class Service extends AbstractEntity { private st
我有一个解决方案,通过连接同一个表两次,但我想知道以下查询是否可以优化? select oc.name as father_occupation, o.name as mother_occupatio
我知道除了知道什么是“最喜欢的编程卡通”之外,stackoverflow 会对我有所帮助:P 这是接受的答案: Bill Karwin 感谢大家的帮助(我想给你们加倍投票) 我的查询结果是这样的(这是
我有两个表格,可以在附图中看到。 表 A 包含部门、月份和平均。 表 B 包含月份、年份、RangeStart、RangeEnd 和 颜色。 如果您查看表 B 的屏幕截图,您将看到每个月都有绿色、黄色
我有一个 Linq to sql 如下: var members=db.Members.Include(x=> x.Contact).Count(); 现在由于一些错误的数据,我的成员中的所有联系人都
我有两个表(用户和帖子),我想写出一个用户的所有帖子(以及其他内容)。我想我应该使用 JOIN 和 WHERE,但我在使用 WHERE 时遇到错误。 这是我的代码: SELECT username,
在 Hibernate 是我的持久性提供者的项目中,我可以使用“join fetch”表达式发出查询,Hibernate 将生成反射(reflect)该内容的 SQL:包含使用有效比较路径的联接表达式
我是一名优秀的程序员,十分优秀!