Перейти к содержанию

Чтение данных из базы данных

Следующие методы позволяют загружать данные из базы данных.

  • 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]

  • Модель

    • Метод mod.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):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="track"
    )

    id: int = ormar.Integer(primary_key =True)
    Альбом: Optional (Album)= ormar.ForeignKey(альбом)
    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()
track2 = 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):
    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 (имя ='The Cat',_defaults ={"year": 1999})
Assert Created is True
assert album.name ="The Cat"
album.year == 1999
# object is created as it does not exist
album2, created = await Album.objects.get_or_create (имя ='The Cat')
Assert created is False
album2 == album2
Return-True as the Same Db row Is Returned

!!!предупреждает, что, несмотря на то, что это эквивалентные строки в базе данных, album и album2 в приведенном выше примере представляют собой два разных объекта Python! Обновление одного из них не обновит второй, пока вы не будете явно загружены () новые данные из базы данных.

Обратите внимание, что если вы хотите создать новый объект, вы должны либо передать значение столбца pk, либо установить автоматическое приращение столбца pk.

Первый из них.

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

Получение первой строки из базы данных, отсортированной по возрастанию ключевого столбца.

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

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


Альбом: objects.create(name ='The cat')
Альбом: objects.create(имя ='The Dog')
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):
    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):
    ormar_config = base_ormar_config.copy (tablename="track")

    id: int = ormar.Integer(primary_key =True)
    Альбом: Optional (Album)= ormar.ForeignKey(альбом)
    title: str = ormar.String(max_length =100)
    position: int = ormar.Integer()


tracks = await Track.objects.select ("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):
    ormar_config = base_ormar_config.copy (tablename="album")

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


Альбом: objects.create(name ='The cat')
Альбом: objects.create(имя ='The Dog')
# will asynchronously iterate all Album models yielding one main model at a time from the generator
async for 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.

Метод модели

Каждый экземпляр модели имеет набор способов сохранения, обновления или загрузки самого себя.

Загрузить

Вы можете загрузить связанную модель ForeignKey, вызвав метод load().

load() можно использовать для обновления модели из базы данных, если она была изменена другим процессом.

!!!tip Узнайте больше о методе load() в методах модели

Метод QuerysetProxy

При прямом доступе к соответствующему полю ManyToMany и ReverseForeignKey, возвращайтесь к списку связанных моделей.

Но в то же время он предоставляет подмножество API QuerySet, поэтому вы можете фильтровать, создавать и выбирать связанные модели непосредственно из родительской модели.

Получить

Принцип работы аналогичен описанной выше функции get, но позволяет получать связанные объекты с другого конца отношения.

Tip

Получить или нет

То же самое, что и описанное выше get, но если запись базы данных не найдена, то возвращает None, а не вызывает исключения.

Tip

Получить или создать

То же самое, что и функция get_or_create выше, но позволяет запрашивать или создавать зависимые объекты с другого конца отношения.

Tip

Первый из них.

То же самое, что и первая функция выше, но позволяет запрашивать связанные объекты с другого конца отношения.

Tip

Все.

То же самое, что и все вышеперечисленные функции, но позволяет запрашивать связанные объекты с другого конца отношения.

Tip