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

Возврат исходных данных

Следующий метод позволяет выполнить запрос, но не возвращает модель ormar, а словарь или список кортежей.

  • values(fields = None, exclude_through = False) -> List[Dict]

  • values_list(fields = None, exclude_through = False, flatten = False) -> List

  • Агент наборов запросов

    • QuerysetProxy.values(fields = None, exclude_through = False) Методологии
    • QuerysetProxy.values_list(fields = None, exclude_through= False, flatten = False) Методология

!!!danger Обратите внимание, что значения и значения_list пропускают анализ результатов в модели ormar и, следовательно, не пропускают проверку результатов!

!!!предупреждает, что каждая запись в списке результатов является отражением строки результатов запроса «один к один». Поскольку строки не будут интерпретироваться, если у родительской строки несколько связанных строк, в результатах будут появляться повторяющиеся значения столбцов.

Ценности

values(fields: Union[List, str, Set, Dict] = None, exclude_through: bool = False) -> List[Dict]

Возвращает список словарей, представляющих значения столбцов базы данных.

Параметр fields позволяет выбрать подгруппу полей, которая принимает тот же набор параметров, что и метод fields ().

Обратите внимание на то, что передача поля values (fields) является ярлыком вызова fields (fields). values ().

!!!tip Для получения дополнительной информации о том, что можно передать в поле, и о том, как выбрать поля вложенной модели, см. раздел Выбор документа столбца

Можно ограничить количество строк, указав условия в filter () и except (), но обратите внимание, что, даже если только одна строка (или ее отсутствие!) соответствует вашим критериям, вы возвратите список в ответ.

Примеры:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Declared models

Категория (Ormar. Model):
    ormar_config = base_ormar_config.copy (tablename ="categories ")

    id: int = ormar. Integer (primary_key = True)
    name: str = ormar. String (max_length = 40)
    sort_order: int = ormar. Integer (nullable = True)


Класс Post (Ormar. Model):
    ormar_config = base_ormar_config ()

    id: int = ormar. Integer (primary_key = True)
    name: str = ormar. String (max_length = 200)
    Категория: Optional [Category]= ormar. ForeignKey (Категория)

#sample Data
news = await Category (name ="News", sort_order = 0). save (
wait Post (name ="Ormar strikes again!", категория = news). save ()
await Post (name ="Why don't you use ormar yet?", категория = news). save ()
await Post (name ="Check this out, ormar Now for free "). save ()

Доступ к почтовым моделям:

1
2
3
4
5
6
posts = await Post.objects.values ()
Расселение posts =[
    {"id": 1, "name": "Ormar strikes again!", "category": 1},
    {"id": 2, "name": "Why don't you use ormar yet?", "category": 1},
    {"id": 3, "name": "Check this out, ormar now for free", "category": 1},
]

Для одновременного выбора связанной модели используйте команды select_lated или prefetch_lated.

Обратите внимание на то, что столбцы вложенных моделей имеют префикс для полного пути связей между автономными моделями (моделями, используемыми в запросе).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#declare Models

Класс пользователя (ormar. Model):
    ormar_config = base_ormar_config ()

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


Класс Role (модель ormar.):
    ormar_config = base_ormar_config ()

    id: int = ormar. Integer (primary_key = True)
    name: str = ormar. String (max_length = 100)
    users: List [User]= ormar. ManyToMany (User)

#sample Data
Creator = await User (name ="Anonymous "). save ()
admin = await Role (name ="admin "). save ()
Редактор = await Role (name ="editor "). save ()
await creator.roles.add (admin)
await creator.roles add(editor)

Выбор пользователей с ролью

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
user = User.objects.select ("roles").values()
Оригинальное название: Note nested prefixes: roleuser and roles
user == [
    {
        "ID": 1,
        "name": "Anonymous",
        "roleuser_id": 1,
        "roleuser_role": 1,
        "roleuser_user": 1,
        "roles_id": 1,
        "roles_name": "admin",
    },
    {
        "ID": 1,
        "name": "Anonymous",
        "roleuser_id": 2.
        «roleuser_role»: 2,
        "roleuser_user": 1,
        «roles_id»: 2,
        "roles_name": "editor",
    },
]

!!!note Обратите внимание, что роль связана с пользователем, так что по умолчанию можно получить столбцы модели.

Выберите связанные поля и поля вместе, чтобы выбрать только три поля.

Обратите внимание на то, что мы также исключили определение из модели, так как в соответствии с определением каждая модель, включенная в соединение, но не имеющая ссылок в поле, считается полностью выбранной (включая все поля).

!!!note Обратите внимание, что в отличие от других подходов к набору запросов, которые используются здесь, можно исключить промежуточные модели, но оставить последние столбцы, что не имеет смысла при анализе исходных данных в модели.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
So in relation category -> category_x_post-> user you can exclude
category_x_post and post-models but can keep the user one. (in ormar model)
Context that is not possible as if you will exclude through and post model
Не нужно было бы перебраться из категории пользователей.


user = (
        Role.objects.select ("users__categories")
        filter(name="admin")
        .fields({"name": ..., "users": {"name": ..., "categories":{"name"}}})
        . exclude_fields ("roleuser")
        Values()
    )
user == [
    {
        Имя: "admin",
        "users_name": "Anonymous",
        "users_categories__name": "News",
    }
]

Если в запросе содержится несколько моделей ManyToMany, каждую модель необходимо исключить вручную.

Чтобы избежать этой нагрузки, ormar предоставляет параметр except_through =False. Если установить для этого флажка значение True, все модели будут полностью исключены.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# equivalent to query above, note lack of exclude_fields call
user = (
    Role.objects.select ("users__categories")
    filter(name="admin")
    .fields({"name": ..., "users": {"name": ..., "categories":{"name"}}})
    Values(exclude through=True)
)
user == [
    {
        Имя: "admin",
        "users_name": "Anonymous",
        "users_categories__name": "News",
    }
]

Список значений

values_list(fields: Union[List, str, Set, Dict] = None, flatten: bool = False, exclude_through: bool = False) -> List

Возвращает список кортежей, представляющих значения столбцов из базы данных.

Параметр fields позволяет выбрать подгруппу полей, которая принимает тот же набор параметров, что и метод fields().

Обратите внимание на то, что передача поля values_list (fields) является ярлыком вызова fields(fields).values_list ().

!!!tip Для получения дополнительной информации о том, что можно передать в поле, и о том, как выбрать поля вложенной модели, см. раздел Выбор документа столбца

Если выбрать только один столбец/поле, можно передать flatten=True, что возвращает список значений, а не кортеж элементов.

Предупреждение!!!: Если выбрано несколько полей (или их нет, то все), настройка flatten=True приведет к появлению исключения QueryDefinitionError.

Можно ограничить количество строк, указав условия в filter() и except(), но обратите внимание, что, даже если только одна строка (или ее отсутствие!) соответствует вашим критериям, вы возвратите список в ответ.

Примеры:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# declared models

Категория (Ormar.Model):
    ormar_config = base_ormar_config.copy (tablename="categories")

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =40)
    sort_order: int = ormar.Integer(nullable=True)


Класс Post(Ormar.Model):
    ormar_config = base_ormar_config ()

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =200)
    Категория: Optional[Category] = ormar.ForeignKey(Категория)

# sample Data
news = await Категория (name="News", sort_order =0).save()
wait Post(name="Ormar strikes again!", категория =news).save()
await Post(name="Why don't you use ormar yet?", категория =news).save()
await Post(name="Check this out, ormar Now for free").save()

Доступ к почтовым моделям:

1
2
3
4
5
6
7
posts = await Post.objects.values_list ()
# note how columns refer to id, name and category (fk)
Расселение posts = [
    (1, "Ormar strikes again!", 1),
    (2)«Почему ты не используешь ормар?», 1)
    «Проверь это выступ, ormar Now for free », 1)
]

Для одновременного выбора связанной модели используйте команды select_lated или prefetch_lated.

Давайте усложним отношения и изменим модель категорий, о которой говорилось выше, для ссылки на пользовательскую модель.

1
2
3
4
5
6
7
8
Категория (Ormar.Model):
    ormar_config = base_ormar_config.copy (tablename="categories")

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =40)
    sort_order: int = ormar.Integer(nullable=True)
    # New Column Below
    created_by: Optional[User] = ormar.ForeignKey(User, related_name ="categories")

Теперь создайте образцы данных с пользовательскими ссылками.

1
2
3
4
5
6
creator = await User(name="Anonymous").save()
admin = await Role(name="admin").save()
Редактор = await Role(name="editor").save()
await creator.roles.add (admin)
await creator.roles add(editor)
news = await Категория (name="News", sort_order =0, created_by =creator).save()

Выберите связанные поля и поля вместе, чтобы выбрать только три поля.

Обратите внимание на то, что мы также исключили определение из модели, так как в соответствии с определением каждая модель, включенная в соединение, но не имеющая ссылок в поле, считается полностью выбранной (включая все поля).

!!!note Обратите внимание, что в отличие от других подходов к набору запросов, которые используются здесь, можно исключить промежуточные модели, но оставить последние столбцы, что не имеет смысла при анализе исходных данных в модели.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
So in relation category -> category_x_post-> user you can exclude
category_x_post and post-models but can keep the user one. (in ormar model)
Context that is not possible as if you will exclude through and post model
Не нужно было бы перебраться из категории пользователя модели.


user = (
        Role.objects.select ("users__categories")
        filter(name="admin")
        .fields({"name": ..., "users": {"name": ..., "categories":{"name"}}})
        . exclude_fields ("roleuser")
        . values_list (
    )
assert user == [("admin", "Anonymous", "News")]

Если в запросе содержится несколько моделей ManyToMany, каждую модель необходимо исключить вручную.

Чтобы избежать этой нагрузки, ormar предоставляет параметр except_through =False. Если установить для этого флажка значение True, все модели будут полностью исключены.

1
2
3
4
5
6
7
8
# equivalent to query above, note lack of exclude_fields call
user = (
        Role.objects.select ("users__categories")
        filter(name="admin")
        .fields({"name": ..., "users": {"name": ..., "categories":{"name"}})
        . values_list (exclude through=True)
    )
assert user == [("admin", "Anonymous", "News")]

Используйте flatten для получения списка значений.

1
2
3
4
5
6
# using flatten with more than one field will exception!
await Role.objects.fields({"name", "id"}). values_list (flatten=True)

# proper usage
roles = await Role.objects.fields ("name"). values_list (flatten=True)
assert roles == ["admin", "editor"]

Метод QuerysetProxy

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

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

!!!предупреждает, что, поскольку использование values и values_list пропускает анализ и проверку модели, эти два метода не очищают загруженную в данный момент связанную модель и не перезаписывают загруженную модель своими результатами вызова!

Ценности

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

Tip

Список значений

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

Tip