【问题标题】:AppEngine Python NDB Type Error on .order().order() 上的 AppEngine Python NDB 类型错误
【发布时间】:2016-06-24 20:13:30
【问题描述】:
@property
def returns_an_int(self):
    some_var = do_something_that_returns_int()
    if some_var:
        return int(some_var)
    else:
        return 0

我有一个使用上面代码的属性,它应该(并且确实)返回一个 int。 (我将 int 强制转换为仔细检查)但是当我尝试使用它来订购 fetch 时,cls.query().order(cls.returns_an_int) 我收到一个类型错误TypeError: order() expects a Property or query Order; received <property object at 0xsome-hex-address> - 我尝试使用 + 或 - 看看我是否可以做到得到一个值,因为我在其他问题中看到了它,但它没有用。我究竟做错了什么?我是否缺少使其工作的基本内容?

【问题讨论】:

    标签: python google-app-engine google-cloud-datastore models app-engine-ndb


    【解决方案1】:

    当您查询数据存储时,您需要查询各种ndb.Property types 之一。您正在查询 vanilla python 属性。这不起作用,因为 python 属性数据永远不会存储在数据存储中,因此数据存储无法按它不知道的数据排序。

    很难就如何解决这个问题给出明确的建议。您可以在没有.order 的情况下进行查询并在客户端代码中进行排序:

    return sorted(cls.query(), key=lambda item: item.returns_an_int)
    

    但这不适用于具有 很多 个实体的实体类型。您还可以将您的属性更改为ndb.ComputedProperty

    @ndb.ComputedProperty
    def returns_an_int(self):
        some_var = do_something_that_returns_int()
        if some_var:
            return int(some_var)
        else:
            return 0
    

    这里的缺点是您要存储(并支付)更多的数据存储数据,并且您还为每个放置的数据存储执行returns_an_int 方法。如果它是一种快速执行的方法,那应该不是问题,但如果它是一种慢速方法,您可能会开始注意到差异。

    【讨论】:

    • 谢谢!到那时我可能最终会改变我的模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多