python-sdk
python-sdk copied to clipboard
Query 类的 or_ 方法和 and_ 方法中存在问题
参考代码 2.9.3 版本:https://github.com/leancloud/python-sdk/blob/v2.9.3/leancloud/query.py#L117
query = Query(queries[0]._query_class._class_name)
- 不应该使用 Query 声明新的对象,而应该使用 cls 来声明,否则会导致继承 Query 得来的 MyQuery 类的 or_ 方法和 and_ 方法返回父类声明的实例。
In [1]: from leancloud import Query
In [2]: class MyQuery(Query):
...: pass
...:
In [3]: type(MyQuery('User').or_(MyQuery('User'), MyQuery('User')))
Out[3]: leancloud.query.Query
- 没有正确处理 ObjectMeta 中特殊处理过的 _ 开头的表。
In [1]: from leancloud import User
In [2]: User.query._query_class
Out[2]: leancloud.user.User
In [3]: User.query.or_(User.query, User.query)._query_class
Out[3]: leancloud.object_._User
以上问题会给通过继承 Object 和 Query 来自定义功能带来困扰。
SDK 的设计当时没有考虑 Query 的子类化。(当然很欢迎提 PR