我如何执行外键查询

时间:2019-06-23 19:04:45

标签: python mysql orm peewee

为了避免N + 1问题,我正在尝试获取一组表的所有信息。

我有一个名为Zone的Peewee模型。另外,我还有一个名为MyObject的对象。 MyObject属于Zone,因此在我的模型中,我已将MyObject.zone声明为Foreign MyObject作为相关参数(如何从区域中访问它)。

现在,我想检索zone内部(包括所有列)的所有对象,以便通过JSON发送。 天真的方法是在for内的Zone.select()循环,然后在循环内获取每个Object的信息。该方法的问题是我有很多条目,这将引起N + 1问题。

Peewee文档建议的方式是执行Join,然后仅在一个查询中获取所有信息,如下所示:

Zone.select(Zone, MyObject).join(MyObject)

这里的问题是返回的查询有N个条目(其中N是对象数),每个条目都是一个Zone,只有一个对象,这是错误的。它应该返回M个条目,其中M是Zone的数量,并且在Zone.myobjects的每个Zone内,有一个列表,列出了属于该zone的对象的数量

query = Zone.select(Zone,MyObject).join(Zone)
zones = list(query) # N zones, not M
zone[0].myobjects # It cointains a query template 

我尝试制作一个group by,但我也遇到了问题。

query = Zone.select(Zone,MyObject).join(Zone).group_by(MyObject.zone)
zones = list(query) # M zones, that is good but inside each zone, zone.lights has nothing and zone.myobjects is only one object no a list
zone[0].myobjects # It cointains a query template 

我不知道如何进行。重要的是,要准备好访问所有列而不是作为模板查询,因为我有很多条目。