2014-12-19 5 views
1

테이블이 offices 인 기존 데이터베이스가 있습니다. 그것은 다음과 같은 필드가 있습니다 제대로 someoffice.parent 작품을 호출, 현재의 형태에서데이터가있는 데이터베이스에서 django-mptt를 활성화/사용하려면 어떻게합니까?

class Office(models.Model): 
    id   = models.IntegerField(primary_key=True) 
    lvl   = models.IntegerField(blank=True, null=False) 
    parent  = models.ForeignKey('self', null=True) 
    name  = models.TextField(blank=True) 
    code  = models.TextField(blank=True) 

    class Meta: 
     managed = False 
     db_table = 'offices' 

    def __str__(self): 
     return "(" + self.code + ") " + self.name + ", level " + str(self.lvl) 

부모를 반환

id 
lvl 
parent_id 
name 
code 

내가처럼 보이는 장고 (1.7) 모델이있다. 그러나 someoffice.children()에 전화를 걸어 개별 부모 노드의 하위 항목을 다시 가져올 수 있어야합니다.

이것은 django-mptt의 좋은 사용 예입니다. 그러나 Django가 누락 된 마이그레이션에 대한 오류를 발생시키지 않으면 서 기존 모델 및 데이터베이스 테이블에서 django-mptt을 사용하는 방법을 알 수 없습니다. 모델을 스크랩하거나 다른 것으로 교체하는 것이 기쁘다. 내가 한 번하고 쉽게 할 수없고 더이상 고생 할 필요가 없다면 기존 테이블을 버려두고 싶지 않습니다.

django-mptt을 구현하기 위해 기존 데이터베이스 테이블을 어떻게 사용할 수 있습니까?


편집 :이 나는 또한 사용하고자하는 것 django-mptt에서 여러 가지 다른 편의 기능은, 그래서 테이블을 수정하기 위해, 기존의 테이블과 django-mptt을 구현하는 두 방법에 대한 조언을 찾고 있어요 in situ 마이그레이션없이 django-mptt을 사용하거나 새 테이블을 만든 다음 내 데이터를로드 할 수 있습니다. 이상적으로는 기존 테이블을 변경 한 다음 django-mptt을 사용하여 장고 마이그레이션을 실행할 필요가 없습니다.

답변

2

부모님을위한 자녀를 받고 싶다면 mptt가 필요하지 않습니다. 그 기능은 Django에 내장되어 있습니다 : Office의 인스턴스가 my_office이라면 my_office.office_set.all()으로 자식을 얻을 수 있습니다.

parent  = models.ForeignKey('self', null=True, related_name='children') 

지금 당신이 my_office.children.all()을 수행 할 수 있습니다

당신은 아마 반대 접근에게 당신이 필드 정의를 수정하여 할 수있는 더 좋은 이름을주고 싶다.

+0

정보를 제공해 주셔서 감사합니다. 나는 질문에 포괄적이지 않았기 때문에 그것을 편집 할 것이다. 'django-mptt'에는 템플릿과 같은 다른 편리한 함수가 있습니다. 그래서 테이블을 가지고 구현할 방법을 찾고 있습니다. 그리고/또는 새로운 것을 생성해야하는지에 대한 조언을합니다. 테이블로 옮기고 데이터를 그 안에 옮긴다. – Clay