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'])
}

另请参见

数据集

过滤记录

set_fields

set_order_by

set_where