2015-01-31 466 views
1

不工作我使用一个SQLite后端用一个简单的展示 - 季 - 集模式:ORDER_BY()方法peewee

class Show(BaseModel): 
    name = CharField() 

class Season(BaseModel): 
    show = ForeignKeyField(Show, related_name='seasons') 
    season_number = IntegerField() 

class Episode(BaseModel): 
    season = ForeignKeyField(Season, related_name='episodes') 
    episode_number = IntegerField() 

,我会需要以下查询:

seasons = (Season.select(Season, Episode) 
     .join(Episode) 
     .where(Season.show == SHOW_ID) 
     .order_by(Season.season_number.desc(), Episode.episode_number.desc()) 
     .aggregate_rows()) 

SHOW_ID作为我想要季节列表的节目的编号。 但是当我遍历查询用下面的代码:

for season in seasons: 
    for episode in season.episodes: 
     print(episode.episode_number) 

...我得到的一些东西,完全不下令,以及甚至不按照顺序我会得到不使用ORDER_BY()即插入顺序。

我激活了调试日志以查看传出查询,并且查询包含ORDER BY子句,并手动应用它返回正确的降序。

我是peewee的新手,我看到很多使用join()的例子与一个order_by()结合使用,但我仍然无法找出我做错了什么。

回答

2

这是由于在聚合查询结果包装中处理嵌套集合中的一个错误。

GitHub的问题是:https://github.com/coleifer/peewee/issues/519

的修复已经在这里融合:https://github.com/coleifer/peewee/commit/ec0e87f1a480695d98bf1f0d7f2e63aed8dfc440

所以,让你要么需要克隆主机或等待直到下一个版本应该是在修复接下来的一两周(2.4.7)。

+0

我只是等待发布,非常感谢修复! – rkohser 2015-02-01 10:26:18

+0

我刚刚测试没有aggregate_rows(),它仍然没有排序。 – rkohser 2015-02-01 14:06:11

+0

是的,没有'aggregate_rows()'会有所不同 - 我假设你正在遍历'season.episodes'?如果是这样,你就会招致“N + 1”查询问题。 – coleifer 2015-02-01 16:27:07