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

Взаимоотношения

В настоящее время Ormar поддерживает два типа отношений:

  • Один к плюсу (и несколько к одному) с полем foreignkey
  • Несколько к нескольким с полем ManyToMany

Ниже вы можете найти очень простые примеры определения каждой связи.

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

Внешний ключ

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from typing import Dict, Optional, Union

import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Department(ormar.Model):
    ormar_config = ormar_base_config.copy()

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


class Course(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    department: Optional[Union[Department, Dict]] = ormar.ForeignKey(Department)

!! Для получения дополнительной информации о взаимоотношениях один к нескольким, пожалуйста, посетите раздел Внешние ключи

Внешние внешние линии

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

Таким образом, в приведенном выше примере.

1
2
3
4
5
6
7
8
Класс Департамента (Ormar.Model):
    ormar_config = base_ormar_config ()

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =100)
    Там, где виртуальное поле здесь, как слоны.
    courses: Optional[List[Course]] = ormar.ForeignKey(Course, virtual=True)
    Комментарии, которые вы делаете не define it yourself, ormar does it for you.

множественно-один"(т. е. об изменении имени генерируемого поля), посетите раздел "Внешние ключи

!!!tip ReverseforeignKey позволяет использовать queryset-proxy для поиска связанных моделей.

1
It allows you to use `await department.courses.all()` to fetch data related only to specific departments etc.

Больше чем больше

Для определения отношения "Мноя-мульти-несколько" используйте поле "ManyToMany".

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Категория (Ormar.Model):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="категории",
    )

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

Класс Post(Ormar.Model):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
    )

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

Множественный ко многим", пожалуйста, посетите раздел "Множественный ко многим

!!!tip ManyToMany позволяет использовать queryset-proxy для поиска связанных моделей.

1
It allows you to use `await post.categories.all()` but also `await category.posts.all()` to fetch data related only to specific post, category etc.

Через поле.

В рамках отношений ManyToMany можно определить сквозную модель, которая может содержать дополнительные поля, доступные для фильтрации, сортировки и т. д. Определенные таким образом поля будут доступны в обратной стороне текущего запроса модели m2m.

Таким образом, при запросе модели А в модель В только модель В отображается поле через него. Это имеет значение, поскольку это односторонняя модель/поле для каждой связанной модели.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Категория (Ormar.Model):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="категории",
    )

    id = ormar.Integer(primary_key =True)
    name = ormar.String(max_length =40)

Вы можете задать конкретные вопросы по подбору стильных документов на основе моделей
Категория публикаций (Ormar.Model):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
        tablename="posts_x_categories",
    )

    id: int = ormar.Integer(primary_key =True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length =200)


Класс Post(Ormar.Model):
    Органом-де-Органом-Органом-де-Органом-Органом (
        database= база данных,
        Метаданные = метаданные,
    )

    id: int = ormar.Integer(primary_key =True)
    title: str = ormar.String(max_length =200)
    Категория = ormar.ManyToMany(Категория, через =PostCategory)

!!!tip Для получения дополнительной информации о взаимосвязях и полях «много-много» см. раздел «Много-много»

!!!tip ManyToMany позволяет использовать queryset-proxy для поиска связанных моделей.

1
It allows You to use `await post.categories.all()` Но все равно `await category.posts.all()` to fetch data related only to specific post, category etc.

Порядок сортировки связей по умолчанию

По умолчанию отношения следуют порядку сортировки модели по умолчанию, поэтому столбец Primary_key по возрастанию или любой порядок сортировки в объекте ormar_config.

!!! Советы для получения дополнительной информации о порядке сортировки моделей см. в разделе "Модель" документа

Однако можно изменить порядок загрузки связанных моделей во время запроса, предоставив для связи параметры orders_by и related_orders_by.

В отношениях можно отсортировать только по непосредственно связанным столбцам модели, а для нескольких пар столбцов можно сортировать по столбцам модели {through_field_name}__{column_name}

Примеры конфигурации могут выглядеть следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Database = databases. Databases (DATABASE)
Metadata = sqalchemy.MetaData


«Органа»((
    database= база данных,
    Метаданные = метаданные,
)


Класс автора (ormar.Model):
    ormar_config = base_ormar_config ()

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


Модель (Ormar):
    ormar_config = base_ormar_config ()

    id: int = ormar.Integer(primary_key =True)
    (((
        Author, orders_by =["name"], related_orders_by =["-year"]
    )
    title: str = ormar.String(max_length =100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

Теперь вызовите:

await Author.objects.select_related("books").get() - Книги будут отсортированы по годам книги.

await Book.objects.select_related("author").all() - Авторы будут сортироваться по возрастанию имени автора

Самостоятельная и отложенная ссылка

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
PersonRef = Forwardref("Person")


Класс Персон (модель):
    ormar_config = base_ormar_config ()

    id: int = ormar.Integer(primary_key =True)
    name: str = ormar.String(max_length =100)
    Supervisor: PersonRef = ormar.ForeignKey(PersonRef, related_name ="employees")


((): update_forward (

!!! Для получения дополнительной информации о самоссылках и отсрочке, пожалуйста, посетите раздел «Задержка комментарии»