open
- open(self, options=None, expanded=None, fields=None, where=None,
- order_by=None, open_empty=False, params=None, offset=None, limit=None,
- funcs=None, group_by=None, safe=False)
使用范围: server
编程语言: python
父类: Item 类
描述说明
调用 open 方法来生成并执行针对实体项数据库表的 SELECT SQL 查询语句,以获取数据集。
该方法初始化实体项的 fields 属性, 设置请求的参数,
并触发为实体项已定义的 on_before_open 事件处理程序。
如果为实体项定义了 on_open 事件处理程序,
那么 open 方法执行此事件处理程序并将获得的数据集分配给返回的结果。
否则,将根据请求的参数生成 SELECT SQL 查询语句,
再执行生成的查询语句并将执行的结果分配给数据集。
稍后,将 active 设置为 true ,
将 item_state 设置为 浏览模式,
将游标定位到数据集的第一条记录,触发已定义的 on_after_open 事件处理程序。
参数
你可以传入``options`` 字典,以与客户端 open 方法完全相同的格式来指定请求参数:
invoices.open({
'fields': ['customer', 'invoicedate', 'total'],
'where': {customer: customer_id, invoicedate__ge: date1, invoicedate__le: date2},
'order_by': ['invoicedate']
})
或者传递关键字参数:
invoices.open(
fields=['customer', 'invoicedate', 'total'],
where={customer: customer_id, invoicedate__ge: date1, invoicedate__le: date2},
order_by=['invoicedate']
)
expanded- 如果该参数的值是 true ,那么 SELECT 查询语句将含有获取 查找字段 的查找值的 JOIN 子语句,否则结果将不包含查找值。 该参数值默认是true。fields- 使用该参数来指定 SELECT 查询语句中的可用字段。 该参数是一个字段名称的列表。如果省略该参数,将使用 set_fields 方法定义的字段。 如果在 ``open``方法执行之前,未调用 set_fields 方法,将使用所有可用字段。where- 使用该参数指定在 SQL 查询语句中如何过滤记录。 该参数是一个字典,其 “键” 是字段的名称,紧跟双下划线,再加过滤器符号。 (请见 过滤记录 ) 如果省略该参数,将使用 set_where 方法定义的值。 如果在open方法执行之前,未调用 set_where 方法,且省略了where参数,那么将使用为实体项定义的 过滤器 的值来过滤记录。order_by- 使用order_by参数来指定记录的排序顺序。 该参数是一个字段名称的列表。如果字段名称前有 “-” 符号, 那么在该字段上会对记录按降序排序。 如果省略了该参数,将使用 set_order_by 方法定义的列表。offset- 使用offset参数来指定要获取的第一行记录的偏移。limit- 使用 ``limit``参数来限制 SQL 查询语句的输出,只保留输出的前 n 行记录。。funcs- 该参数可以是一个字典,其 “键” 是字段的名称,其 “值” 是函数名称, 在 SELECT 查询语句中,将使用这些函数处理对应的字段。group_by- 使用group_by参数来指定如何对查询的结果按字段分组。 该参数必须是字段名称的列表。open_empty- 如果将此参数设置为true, 那么应用程序不会向服务端方请求,而是仅仅初始化一个空的数据集。 其默认值是false。params- 使用此参数传递用户自定义的一些选项,在 on_open 事件处理程序中将使用这些自定义选项。 该参数必须是一个 “键-值” 对组成的对象。safe- 如果此参数为True, 将检查调用该方法的用户是否有权限查看实体项的数据。 如果用户没有权限,则抛出一个异常。 请见 角色
Examples
在这个例子中,请求的参数是一个字典:
import datetime
def get_sales(item):
date1 = datetime.datetime.now() - datetime.timedelta(days=3*365)
date2 = datetime.datetime.now()
invoices = item.task.invoices.copy()
invoices.open({
'fields': ['customer', 'date', 'total'],
'where': {'date__ge': date1, 'date__le': date2},
'order_by': ['customer', 'date']
})
在下面,传递的参数是一个关键字列表:
import datetime
def get_sales(item):
date1 = datetime.datetime.now() - datetime.timedelta(days=3*365)
date2 = datetime.datetime.now()
invoices = item.task.invoices.copy()
invoices.open(
fields=['customer', 'date', 'total'],
where={'date__ge': date1, 'date__le': date2},
order_by=['customer', 'date']
)
分别使用 set_fields、set_where、set_order_by 方法,可以获得与上面相同的结果:
import datetime
def get_sales(item):
date1 = datetime.datetime.now() - datetime.timedelta(days=3*365)
date2 = datetime.datetime.now()
invoices = item.task.invoices.copy()
invoices.set_fields('customer', 'date', 'total')
invoices.set_where(date__ge=date1, date__le=date2);
invoices.set_order_by('customer', 'date');
invoices.open();
def get_sales(task) {
sales = task.invoices.copy()
sales.open(fields=['customer', 'id', 'total'],
funcs={'id': 'count', 'total': 'sum'},
group_by=['customer'],
order_by=['customer'])
}