Skip to content

从数据库读取数据

以下方法允许您从数据库加载数据。

  • get(*args, **kwargs) -> 模型

  • get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool]

  • first(*args, **kwargs) -> Model

  • all(*args, **kwargs) -> List[Optional[Model]]

  • iterate(*args, **kwargs) -> AsyncGenerator[Model]

  • 模型

    • Model.load()方法
    • 查询集代理

    • QuerysetProxy.get(*args, **kwargs) 方法

    • QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) 方法
    • QuerysetProxy.first(*args, **kwargs) 方法
    • QuerysetProxy.all(*args, **kwargs) 方法

得到

get(*args, **kwargs) -> 模型

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

如果没有设置条件,它将返回数据库中按 pk 列排序的最后一行。

传递一个条件实际上是调用下面描述的filter(*args, **kwargs)方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Track(ormar.Model):
    ormar_config = ormar.OrmarConfig(
        database=database,
        metadata=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()


track = await Track.objects.get(name='The Bird')
# note that above is equivalent to await Track.objects.filter(name='The Bird').get()
track2 = track = await Track.objects.get()
track == track2
# True since it's the only row in db in our example
# and get without arguments return first row by pk column desc

!!!警告 如果没有行满足条件,则会引发 NoMatch 异常。

1
If there are multiple rows meeting the criteria the `MultipleMatches` exception is raised.

获取或无

get_or_none(*args, **kwargs) -> Model

与上面描述的 get 完全相同,但如果没有找到与条件匹配的数据库记录,则返回 None,而不是引发异常。

获取或创建

get_or_create(_defaults: Optional[Dict[str, Any]] = None, *args, **kwargs) -> Tuple[Model, bool]

创建和获取方法的组合。

尝试获取满足条件的行,如果引发 NoMatch 异常,则会使用给定的 kwargs 和 _defaults 创建一个新行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
class Album(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="album")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    year: int = ormar.Integer()


album, created = await Album.objects.get_or_create(name='The Cat', _defaults={"year": 1999})
assert created is True
assert album.name == "The Cat"
assert album.year == 1999
# object is created as it does not exist
album2, created = await Album.objects.get_or_create(name='The Cat')
assert created is False
assert album == album2
# return True as the same db row is returned

!!!警告尽管是数据库中的等效行,但上面示例中的 album 和 album2 是 2 个不同的 python 对象!更新其中之一不会刷新第二个,直到您显式从数据库加载()新数据。

注意,如果你想创建一个新对象,你要么必须传递 pk 列值,要么 pk 列必须设置为自动增量

第一的

first(*args, **kwargs) -> Model

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Album(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="album")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


await Album.objects.create(name='The Cat')
await Album.objects.create(name='The Dog')
album = await Album.objects.first()
# first row by primary_key column asc
assert album.name == 'The Cat'

全部

all(*args, **kwargs) -> List[Optional["Model"]]

对于设置的过滤器选项,返回给定模型的数据库中的所有行。

传递 kwargs 是一种快捷方式,相当于调用 filter(*args, **kwargs).all()。

如果没有满足条件的行,则返回空列表。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Album(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="album")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Track(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="track")

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


tracks = await Track.objects.select_related("album").all(album__title='Sample')
# will return a list of all Tracks for album Sample
# for more on joins visit joining and subqueries section

tracks = await Track.objects.all()
# will return a list of all Tracks in database

迭代

iterate(*args, **kwargs) -> AsyncGenerator["Model"]

返回给定模型的数据库中所有行的异步可迭代生成器。

传递 args 和/或 kwargs 是一种快捷方式,等于调用 filter(*args, **kwargs).iterate()

如果没有满足条件的行,则返回空的异步生成器。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Album(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="album")

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


await Album.objects.create(name='The Cat')
await Album.objects.create(name='The Dog')
# will asynchronously iterate all Album models yielding one main model at a time from the generator
async for album in Album.objects.iterate():
    print(album.name)

# The Cat
# The Dog

!!!警告 使用 iterate() 会导致之前的 prefetch_lated() 调用被忽略;因为这两种优化放在一起没有意义。

1
If `iterate()` & `prefetch_related()` are used together the `QueryDefinitionError` exception is raised.

模型方法

每个模型实例都有一组方法来保存、更新或加载自身。

加载

您可以通过调用load()方法加载ForeignKey相关模型。

load() 可用于从数据库刷新模型(如果它被其他进程更改)。

!!!tip 阅读有关模型方法中的 load() 方法的更多信息

QuerysetProxy 方法

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

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

得到

工作原理与上面的 get 函数完全相同,但允许您从关系的另一端获取相关对象。

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

获取或无

与上面描述的 get 完全相同,但如果没有找到与条件匹配的数据库记录,则返回 None,而不是引发异常。

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

获取或创建

与上面的 get_or_create 函数完全相同,但允许您从关系的另一端查询或创建相关对象。

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

第一的

与上面的第一个函数完全相同,但允许您从关系的另一端查询相关对象。

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

全部

与上面所有功能完全相同,但允许您从关系的另一端查询相关对象。

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