Skip to content

分页和行数

以下方法允许您对查询中的行数进行分页和限制。

  • paginate(page: int) -> QuerySet

  • limit(limit_count: int) -> QuerySet

  • offset(offset: int) -> QuerySet

  • get() -> 模型

  • 第一个() -> 模型

  • 查询集代理

    • QuerysetProxy.paginate(page: int) 方法
    • QuerysetProxy.limit(limit_count: int) 方法
    • QuerysetProxy.offset(offset: int) 方法

分页

paginate(page: int, page_size: int = 20) -> QuerySet

结合了基于页码和大小的偏移和限制方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Track(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=databases.Database(DATABASE_URL),
        metadata=sqlalchemy.MetaData(),
        tablename="track"
    )

    id: int = ormar.Integer(primary_key=True)
    album: Optional[Album] = ormar.ForeignKey(Album)
    name: str = ormar.String(max_length=100)
    position: int = ormar.Integer()


tracks = await Track.objects.paginate(3).all()
# will return 20 tracks starting at row 41 
# (with default page size of 20)

请注意, paginate(2) 相当于 offset(20).limit(20)

限制

limit(limit_count: int, limit_raw_sql: bool = None) -> QuerySet

您可以将结果限制为所需的父模型数量。

要限制数据库查询行的实际数量而不是主模型的数量,请使用 limit_raw_sql 参数标志,并将其设置为 True。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Track(ormar.Model):
    ormar.OrmarConfig(
        database=databases.Database(DATABASE_URL),
        metadata=sqlalchemy.MetaData(),
        tablename="track"
    )

    id: int = ormar.Integer(primary_key=True)
    album: Optional[Album] = ormar.ForeignKey(Album)
    name: str = ormar.String(max_length=100)
    position: int = ormar.Integer()


tracks = await Track.objects.limit(1).all()
# will return just one Track

!!!注意所有不返回行的方法显式返回一个 QuerySet 实例,以便您可以将它们链接在一起

1
2
3
So operations like `filter()`, `select_related()`, `limit()` and `offset()` etc. can be chained.

Something like `Track.object.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()`

抵消

offset(offset: int, limit_raw_sql: bool = None) -> QuerySet

您还可以通过所需的主模型数量来抵消结果。

要偏移数据库查询行的实际数量而不是主模型的数量,请使用 limit_raw_sql 参数标志,并将其设置为 True。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Track(ormar.Model):
    ormar.OrmarConfig(
        database=databases.Database(DATABASE_URL),
        metadata=sqlalchemy.MetaData(),
        tablename="track"
    )

    id: int = ormar.Integer(primary_key=True)
    album: Optional[Album] = ormar.ForeignKey(Album)
    name: str = ormar.String(max_length=100)
    position: int = ormar.Integer()


tracks = await Track.objects.offset(1).limit(1).all()
# will return just one Track, but this time the second one

!!!注意所有不返回行的方法显式返回一个 QuerySet 实例,以便您可以将它们链接在一起

1
2
3
So operations like `filter()`, `select_related()`, `limit()` and `offset()` etc. can be chained.

Something like `Track.object.select_related("album").filter(album__name="Malibu").offset(1).limit(1).all()`

得到

get(**kwargs) -> 模型

从数据库中获取满足 kwargs 设置条件的第一行。

如果没有设置条件,它将返回 db 中按 pk 排序的最后一行。 (也不能使用过滤/排除来设置条件)。

!!!tip 要了解有关 get 的更多信息,请访问 read/get

第一的

第一个() -> 模型

从数据库中获取按主键列升序排序的第一行。

!!!tip 要了解有关首次访问的更多信息,请阅读/first

QuerysetProxy 方法

当直接访问相关的ManyToMany字段以及ReverseForeignKey时,返回相关模型的列表。

但同时它公开了 QuerySet API 的子集,因此您可以直接从父模型过滤、创建、选择相关模型等。

分页

与上面的分页功能完全相同,但允许您从关系的另一端对相关对象进行分页。

!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分

限制

与上面的 limit 函数完全相同,但允许您从关系的另一侧对相关对象进行分页。

!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分

抵消

与上面的偏移函数完全相同,但允许您从关系的另一侧对相关对象进行分页。

!!!tip 要了解有关 QuerysetProxy 的更多信息,请访问 querysetproxy 部分