Взаимоотношения
В настоящее время 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, который автоматически регистрирует вас.
Таким образом, в приведенном выше примере.
| Класс Департамента (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 для поиска связанных моделей.
| 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 для поиска связанных моделей.
| 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 для поиска связанных моделей.
| 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 (
|
!!! Для получения дополнительной информации о самоссылках и отсрочке, пожалуйста, посетите раздел «Задержка комментарии»