콘텐츠로 이동

지연된 의견

자체 참조 모델

관계를 생성하기 위해 선언 중에 동일한 모델을 참조하려면 참조된 모델을 ForwardRef로 선언해야 합니다. 선언 중에 클래스가 준비되지 않았고 Python에서 기본적으로 참조할 수 없기 때문입니다.

향후 주석을 사용하거나 단순히 "와 함께 이름을 참조하고 싶을 수도 있지만 ormar는 명시적으로 선언된 ForwardRef와 함께 사용하도록 되어 있기 때문에 작동하지 않습니다.

먼저 입력에서 필요한 참조를 가져와야 합니다.

1
입력에서 ForwardRef 가져오기

이제 우리는 자기 참조 관계를 만드는 데 사용될 샘플 모델과 동일한 모델에 대한 참조가 필요합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 모델을 만드는 사람
Ref = ForwardRef("사람")


클래스 사람(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    # forwardref를 매개 변수로 사용
    감독자: 페르소나 레프 = ormar. ForeignKey (페르소나 레프, 관련 이름 = "직원")

그렇게 간단합니다. 그러나 모델을 사용하기 전에 참조를 수동으로 업데이트하여 실제 모델을 생성해야 합니다.

!!!경고 참조를 업데이트하지 않고 모델을 사용하려고 하면 모델 오류 예외가 발생합니다. 따라서 위의 예에서 다음과 같은 호출은 예외 python # creation of model - exception await Person.objects.create(name="Test") # initialization of model - exception Person2(name="Test") # usage of model's QuerySet - exception await Person2.objects.get() 를 생성합니다.

참조를 업데이트하려면 모든 관련 모델을 선언한 후에만 전달 참조가 있는 각 모델의 업데이트 _ward_ref 메서드를 호출하십시오.

따라서 이전 예제가 제대로 작동하려면 추가 줄만 있으면 됩니다.

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

当然,对于 to 和 through 参数,可以以完全相同的方式对 ManyToMany 关系完成相同的操作。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 참조를 선언합니다
ChildRef = ForwardRef("어린이")

클래스 어린이 친구(ormar. 모델):
    ormar_config = base_ormar_config 사본()

클래스 차일드(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    # 관련 사용
    친구 = 오마. 많은 것 (ChildRef, 경유 = Childfriend,
                               관련 _ 이름 = " 또한 _ 친구 ")


어린이. d_ford_refs ()

교차 모델 관계

자기 참조 모델과 동일한 메커니즘과 논리를 사용하여 여러 다른 모델을 서로 연결할 수 있습니다.

물론 ormar는 지정된(또는 기본값) 관련 _ 이름을 사용하여 링크 관계의 양쪽에 대해 역방향 관계를 만듭니다.

그러나 어떤 이유로든 두 모델 사이에 두 개 이상의 관계가 필요한 경우 해당 관계가 양쪽에 저장되어야 합니다(따라서 한 모델에 하나의 관계를 선언하고 두 번째 모델에 다른 관계를 선언합니다). 이를 달성하려면 ForwardRef를 사용해야 합니다.

다음의 간단한 예를 살펴보십시오.

 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
# 선생님은 아직 정의되지 않았습니다
TeacherRef = ForwardRef("교사")


클래스 학생(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    # 그래서 우리는 실제 모델 대신 참조를 사용합니다.
    Primary _ 교사: TeacherRef = ormar. ForeignKey (TeacherRef,
                                                   관련 _ 이름 = "자신의 _ 학생")


학급 학생 교사(ormar. 모델):
    ormar_config = base_ormar_config (tablename = 'e_x_')


클래스 교사(ormar. 모델):
    ormar_config = base_ormar_config 사본()

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    # 우리는 다른 관계를 위해 학생이 필요합니다.
    학생 = ormar. 많은 사람 (학생, through=StudentTeacher,
                                관련 _ 이름 = "교사")

# 이제 교사 모델이 이미 정의되었으며 참조를 업데이트할 수 있습니다.
학생. t_ford_refs ()

!!! 경고 아무리 많은 관계가 정의되더라도 관련 모델에서 관련 _ 이름은 고유해야 합니다.