Python:Simple order by with Pony ORM

2024-05-12 23:17:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以,我试着: 第一种方法是发出错误消息:

sel = select((f.Name, f.id) for f in Firma).order_by(Firma.Name)

这样,我从python得到错误消息:“NotImplementedError:Ordering by attributes仅限于返回简单对象列表的查询。尝试使用其他形式的排序(按元组元素编号或按完整的lambda表达式)”

第二种方法,如果按顺序选择是好的,但在我的字典中插入会破坏疾病的选择顺序

^{pr2}$

结果如下:

    === 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

但字典是:

dic  {'Testfirma': 9, 'Quelle': 3, 'C': 12, 'The Pearlfactory': 8, 'B': 11, 'Otto': 6, 'A': 10, 'Neckermann': 7}

现在的问题是:如何在不出现此错误消息的情况下使用order_的第一种聚合方式。 或者,我如何将公司id和公司名称的值放在我的字典中排序的soccesion中

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

你好

尼塞尔


Tags: 方法nameid消息by字典排序顺序
1条回答
网友
1楼 · 发布于 2024-05-12 23:17:11

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

query = select((f.Name, f.id) for f in Firma).order_by(1)

这里,1表示“按第一个元组项(即按Name)升序排序”。如果指定-2,则表示“按第二个元组项(即按id)降序排序”。在

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

^{pr2}$

或者,例如:

query = select((f.Name, f.id) for f in Firma).order_by(lambda: desc(f.id))

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

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

Firma.select(lambda f: f.Name).order_by((Firma.Name))

{{cd8>在查询中,{cd9}中使用的过滤对象不是空的。在

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

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内进行(建议这样做),则可以从查询中检索对象而不是元组:

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)

相关问题 更多 >