首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:使用Pony ORM的简单order by

Python:使用Pony ORM的简单order by
EN

Stack Overflow用户
提问于 2017-04-28 02:11:56
回答 1查看 3K关注 0票数 2

我尝试在pony orm中使用order_by聚合实现一个简单的select:

因此,我尝试了几种方法:第一种方法引发错误消息:

代码语言:javascript
复制
sel = select((f.Name, f.id) for f in Firma).order_by(Firma.Name)

通过这种方式,我得到了来自python的错误消息:"NotImplementedError:按属性排序仅限于返回简单对象列表的查询。尝试使用其他形式的排序(按元组元素编号或按完整的lambda expr)“

第二种方法是,按顺序选择很好,但在字典中插入会破坏不同的选择顺序

代码语言:javascript
复制
            for f in Firma.select(lambda f: f.Name) \
                .order_by((Firma.Name)):
            dic[f.Name] = f.id
            print ("=== f.Name", f.Name)
            dic[f.Name] = f.id
            print(" === dic[f.Name]", dic[f.Name])

结果如下:

代码语言:javascript
复制
    === f.Name A
 === dic[f.Name] 10
=== f.Name B
 === dic[f.Name] 11
=== f.Name C
 === dic[f.Name] 12
=== f.Name Neckermann
 === dic[f.Name] 7
=== f.Name Otto
 === dic[f.Name] 6
=== f.Name Quelle
 === dic[f.Name] 3
=== f.Name Testfirma
 === dic[f.Name] 9
=== f.Name The Pearlfactory
 === dic[f.Name] 8

但是字典是这样的:

代码语言:javascript
复制
dic  {'Testfirma': 9, 'Quelle': 3, 'C': 12, 'The Pearlfactory': 8, 'B': 11, 'Otto': 6, 'A': 10, 'Neckermann': 7}

现在的问题是:如果没有这个错误消息,我如何使用order_by聚合的第一种方法。或者,如何将公司id和公司名称的值放入字典中的排序套接字中。

我希望有人能听懂我糟糕的英语;)

问候

尼塞尔

EN

回答 1

Stack Overflow用户

发布于 2017-05-11 16:09:34

关于您的第一个问题,如果查询选择元组,您可以通过指定元组项目的数量来对其进行排序:

代码语言:javascript
复制
query = select((f.Name, f.id) for f in Firma).order_by(1)

在这里,1的意思是“按第一个元组项目(即按Name)升序排序”。比方说,如果您指定-2,它将意味着“按第二个元组项目(即按id)降序排序”。

另一种方法是在order_by部分中指定lambda函数:

代码语言:javascript
复制
query = select((f.Name, f.id) for f in Firma).order_by(lambda: f.Name)

或者,例如:

代码语言:javascript
复制
query = select((f.Name, f.id) for f in Firma).order_by(lambda: desc(f.id))

注意,我使用了不带任何参数的lambda函数。在前一种情况下,lambda中f将引用生成器表达式中的变量f。请注意,IDE不理解该语法,可能会将其突出显示为错误,但代码实际上是正确的。

您的lambda函数查询看起来不正确:

代码语言:javascript
复制
Firma.select(lambda f: f.Name).order_by((Firma.Name))

在查询中,select内部lambda用于过滤,它只过滤名称不为空的对象。

关于你的第二个问题,在Python中,字典是无序的。如果你想保持项目的顺序,你不应该把它们放在字典里。请改用list:

代码语言:javascript
复制
query = select((f.Name, f.id) for f in Firma).order_by(1)
name_id_pairs = query[:]  # retrieve result list from a query
# another form: name_id_pairs = list(query)

for name, id in name_id_pairs:
    print('Name:', name, ', id:', id)

如果所有数据处理都在db_session中进行(推荐),则可以从查询中检索对象而不是元组:

代码语言:javascript
复制
query = select(f for f in Firma).order_by(lambda: f.name)
firms = list(query)
for f in firms:
    print('Name:', f.name, ', id:', f.id)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43665137

复制
相关文章

相似问题

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