콘텐츠로 이동

관계

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를 사용합니다.

따라서 위의 예제의 경우.

1
2
3
4
5
6
7
8
클래스 부서(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    # 여기에 다음과 같은 가상 필드가 있습니다.
    과정: 선택 사항 [목록 [과정] = ormar. ForeigKey (과정, 가상 = 참)
    # 당신이 직접 정의하지 않는다는 점에 유의하십시오. ormar가 당신을 위해 그것을 합니다.

!!!팁 다대일 관계(즉, 생성된 필드의 이름 변경)에 대해 자세히 알아보려면 외래 키 섹션을 방문하십시오.

!!!팁 반전 키를 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.

1
`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을 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.

1
`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을 사용하면 쿼리 세트 프록시를 사용하여 관련 모델을 쿼리할 수 있습니다.

1
`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 ()

!!! 팁 자기 참조 및 이연 관계에 대해 자세히 알아보려면 이연 의견 섹션을 방문하십시오.