관계
Ormar는 현재 두 가지 유형의 관계를 지원합니다.
- 외래 키 필드가 있는 일대다(및 다대일)
- ManyTo많이 필드를 가진 다대다
아래에서 각 관계에 대한 매우 기본적인 정의의 예를 찾을 수 있습니다.
방법, 가능성, 정의 등에 대해 자세히 알아보려면 문서의 다음 섹션을 읽으십시오.
외국 키
다대일 관계를 정의하려면 외부 키 필드를 사용하십시오.
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. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100)
# 여기에 다음과 같은 가상 필드가 있습니다.
과정: 선택 사항 [목록 [과정] = ormar. ForeigKey (과정, 가상 = 참)
# 당신이 직접 정의하지 않는다는 점에 유의하십시오. ormar가 당신을 위해 그것을 합니다.
|
!!!팁 다대일 관계(즉, 생성된 필드의 이름 변경)에 대해 자세히 알아보려면 외래 키 섹션을 방문하십시오.
!!!팁 반전 키를 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.
| `await department.courses.all()` 를 사용하여 특정 부서 등과 관련된 데이터만 가져올 수 있습니다.
|
많이 많이
다대 다의 관계를 정의하려면 ManyTo많이 필드를 사용하십시오.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 클래스 카테고리(ormar. 모델):
ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
표 이름 = "카테고리",
)
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 40)
클래스 포스트(ormar. 모델):
ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
)
ID: int = ormar. 정수(prial_key = 참)
제목: str = ormar. 문자열(max_long = 200)
카테고리: 선택 사항 [목록 [카테고리]] = ormar. 많은 것 (카테고리)
|
!!! 다대다 관계에 대해 자세히 알아보려면 다대다 섹션을 방문하십시오.
!!!Tip ManyToMan을 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.
| `await post.categories.all()` 를 사용할 수 있지만 `await category.posts.all()` 를 사용하여 특정 게시물, 범주 등과 관련된 데이터만 가져올 수 있습니다.
|
들판을 통해
ManyToMan 관계의 일부로 필터링, 정렬 등에 사용할 수 있는 추가 필드를 포함할 수 있는 통과 모델을 정의할 수 있습니다. 이와 같이 정의된 필드는 m2m 모델에서 현재 쿼리의 뒷면에 노출됩니다.
따라서 모델 A에서 모델 B로 쿼리하면 모델 B만 스루 필드를 표시합니다. 각 관련 모델에 대한 단방향 모델/필드이기 때문에 의미가 있습니다.
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. 모델):
ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
표 이름 = "카테고리",
)
ID = ormar. 정수(prial_key = 참)
이름 = ormar. 문자열(max_long=40)
# 전체 모델에 추가 필드를 지정할 수 있습니다.
클래스 포스트 카테고리(ormar. 모델):
ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
표 이름 = "s_x_",
)
ID: int = ormar. 정수(prial_key = 참)
sort_order: int = ormar. 정수(nullable = 참)
param_name: str = ormar. 문자열(기본값 = "이름", max_long = 200)
클래스 포스트(ormar. 모델):
ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
)
ID: int = ormar. 정수(prial_key = 참)
제목: str = ormar. 문자열(max_long = 200)
카테고리 = ormar. 많은 것 (카테고리, through=PostCategory)
|
!!!팁 다대다 관계 및 분야에 대해 자세히 알아보려면 다대다 섹션을 방문하십시오.
!!!Tip ManyToMan을 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.
| `await post.categories.all()` 를 사용할 수 있지만 `await category.posts.all()` 를 사용하여 특정 게시물, 범주 등과 관련된 데이터만 가져올 수 있습니다.
|
관계 기본 정렬 순서
기본적으로 관계는 모델 기본 정렬 순서를 따르므로 기본 _key 열이 오름차순이거나 ormar _config 개체의 정렬 순서를 구성합니다.
!!! 팁 모델 정렬 순서에 대해 자세히 알아보려면 설명서의 모델 섹션을 방문하십시오.
그러나 주문_by 및 관련_order_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_URL)
메타데이터 = sqlalchemy. 메타데이터()
base_ormar_config = ormar. OrmarConfig (
데이터베이스 = 데이터베이스,
메타데이터 = 메타데이터,
)
클래스 작성자(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100)
클래스 북(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
작성자: 선택 사항 [작성자] = ormar. 외래 키(
작성자, ords_by = ["이름"], teds_by = ["-년"]
)
제목: str = ormar. 문자열(max_long = 100)
연도: int = ormar. 정수(nullable = 참)
순위: int = ormar. 정수(nullable = 참)
|
지금 전화하세요:
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 | Ref = ForwardRef("사람")
클래스 사람(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100)
감독자: 페르소나 레프 = ormar. ForeignKey (페르소나 레프, 관련 이름 = "직원")
사람. d_ford_ref ()
|
!!! 팁 자기 참조 및 이연 관계에 대해 자세히 알아보려면 이연 의견 섹션을 방문하십시오.