2009-10-24 5 views
2

내 응용 프로그램에서 현재 장고를 사용하여 특정 클래스 구조를 가지고 있습니다. 모델 레이어를 전혀 사용하지 않았습니다. 데이터베이스 상호 작용 루틴은 직접 작성되었습니다.복잡한 파이썬 개체를 장고 모델에 매핑

그러나 사실상 장고를 최대한 활용하고 실제로 데이터베이스 추상화 계층을 사용할 가능성을 고려합니다. 문제는 내 기존 클래스 구조를 모델 계층과 가장 잘 통합하는 방법입니다.

은 예 클래스 : 여기

class UpperClass(base): 
    def __init__(self, attr1, attr2): 
     self.attr1 = attr1 
     self.attr2 = attr2 
     # attr1 and attr2 are actually instances of, say, 
     # CustomType1 and CustomType2 

소우가 어떻게 장고 모델에이지도를하기 위하여려고하고있다 : 충분히 간단합니다

class UpperClass(models.Model): 
    attr1 = CustomType1Field(...) 
    attr2 = CustomType2Field(...) 

- 모든 직렬화 및 검증 물건은 이미 작성 따라서 CustomType1 및 CustomType2에 대한 사용자 정의 필드 클래스를 작성하는 것이 전혀 어렵지는 않습니다.

실제 질문은 어디에서 실제 UpperClass의 사용자 정의 (데이터베이스와 관련이없는) 동작을 넣을 수 있는가입니다. 내 이해에서 모델은 "데이터베이스에서 물건을 가져오고 나가는"것에 대한 것이지만, 그 동작은 어디에 있습니까? UpperClass의 Model 인스턴스에 비 데이터베이스 관련 메서드를 포함 시키나요? 정말로, 나는 여기에서 손실에있다. 희망이 적어도 당신에게 부분적인 의미가 있습니다.

답변

2

인코딩하려는 특정 동작에 따라 다소 다릅니다. 대부분의 경우, 객체 별 동작을 모델 클래스에 넣어야합니다. 결국 정규 Python 클래스이기 때문에 원하는 모든 메서드를 제공 할 수 있습니다. 당연히, 예를 들어, 당신이 원하는대로 지속성을 설명 할 필요가 있습니다. 스키마에 지정된 것 이외의 추가 구성원 데이터는 피하십시오.

+0

갑자기, 이것은 나에게 완벽합니다. 모델 필드 (models.Field의 하위 클래스)는 파이썬 유형/클래스 (to_python()을 통해)로 다시 매핑되므로 UpperClass의 클래스 인스턴스가 초기화되는 방식에 상관없이 - 내 코드에서 __init__에 대한 직접 호출을 통해 a = UpperClass (attr1 = foo, attr2 = bar)) 또는 ORM을 통해 (a = Upperclass.objects.get (...)). 어쨌든 인스턴스 네임 스페이스는 attr1과 attr2가 올바른 유형으로 초기화되어 채워집니다. 내가 너를 정확하게 이해 했니? – shylent

+0

예 : UpperClass의 인스턴스는 일반 속성 attr1 및 attr2 (데이터베이스에서 읽음)를 사용하는 일반 Python 객체입니다. –

+0

도움을 주셔서 대단히 감사드립니다. – shylent

0

이것은 주로 MVC이며 구현 방법을 선택하는 철학적 질문입니다. 여기서는 올바른 방법이 없지만 상호 작용하는보기에 관계없이 모델 개체가 모두 특정 방식으로 동작하기를 원한다고 가정하면이 동작을 모델에 첨부하는 것이 좋습니다. 비헤이비어가 특정 뷰에만 한정되고 모델과 상호 작용하는 다른 많은 뷰가있는 경우 뷰에 뷰를 첨부하는 것이 더 적합 할 수 있습니다.