2012-06-19 3 views
3

리프 노드가 다른 모델의 인스턴스가 될 수있는 hirerchical 어플리케이션을 개발 중입니다. 내가 장고 - mptt 응용 프로그램과 함께 작동하게하는 방법을 알아낼 수 없습니다. 이 응용 프로그램에서도 가능합니까? 그렇다면 내가 뭘 잘못하고 있니? 만약에 없다면, 거기에 무엇인가가 있습니까? 나는 무엇을하려고합니까? 나는 내가 단지 폴더 아이를 얻을 수 및 이미지 없음 나는 다음과 같은 작업을 수행 할 때여러 유형의 Django-MPTT 리프 노드

class FolderItemBase(MPTTModel): 
    order = models.PositiveIntegerField() 

    class Meta: 
     abstract = True 

    class MPTTMeta: 
     parent_attr = 'folder' 
     order_insertion_by = ['order'] 

class Folder(FolderItemBase): 
    folder = TreeForeignKey('Folder', related_name='folders', blank=True, null=True) 
    ... 

class Image(FolderItemBase): 
    folder = TreeForeignKey('Gallery', related_name='images') # cannot be null since leaf has to be inside of a folder 
    ... 

:

다음은 모델의 기본 구조입니다. 당신이 그것을 볼 수 있듯이

Folder table 
---------------- 
+----+-------+-----+------+---------+-------+-----------+----------+ 
| ID | order | lft | rght | tree_id | level | folder_id | title | 
+----+-------+-----+------+---------+-------+-----------+----------+ 
| 1 | 0  | 1 | 4 | 1  | 0  |   | Folder 1 | 
+----+-------+-----+------+---------+-------+-----------+----------+ 
| 2 | 0  | 2 | 3 | 1  | 1  | 1   | Folder 2 | 
+----+-------+-----+------+---------+-------+-----------+----------+ 

Images Table 
------------ 
+----+-------+-----+------+---------+-------+-----------+ 
| ID | order | lft | rght | tree_id | level | folder_id | 
+----+-------+-----+------+---------+-------+-----------+ 
| 1 | 1  | 2 | 3 | 1  | 1  | 1   | 
+----+-------+-----+------+---------+-------+-----------+ 

을해야 어떤 수치 : 똑같은 나는 이미지

>>> folder1 = Folder.objects.create(title='Folder 1', order=0) 
>>> folder2 = Folder(title='Folder 2', order=0) 
>>> folder2.insert_at(folder1, save=True) 
>>> image = Image(...) 
>>> image.insert_at(folder1, save=True) 
>>> folder1.get_children() 
[<Folder: Folder 2>] 
>>> image.get_ancestores() 
[] 

의 조상을 얻으려고 그리고이 일이 모든 후 DB에 저장하는 방법을 때 (적어도 적어도 보이는 것처럼 보이지만) 폴더 테이블의 내용은 업데이트되지 않으므로 쿼리를 시도 할 때 아무 것도 선택되지 않습니다.

모든 포인터가 감사하겠습니다. 고맙습니다.

답변

6

AFAIK, 이것은 불가능합니다. django-mptt 피기 백은 Django의 QuerySet을 지원하며 이는 한 가지 유형의 항목에서만 작동합니다. contenttypes 프레임 워크를 사용하여 "실제"항목을 FolderItem과 같은 항목과 연결할 수 있습니다.이 항목은 계층 구조에만 사용됩니다 (예 : 그런 다음

from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class FolderItem(MPTTModel): 
    folder = TreeForeignKey('Folder', related_name='folders', blank=True, null=True 
    order = models.PositiveIntegerField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     abstract = True 

    class MPTTMeta: 
     parent_attr = 'folder' 
     order_insertion_by = ['order'] 

, 당신은 장고 - mptt 관리자 방법을 사용하는 등, 당신은 FolderItem s의 검색어 세트를 다시 얻을 것이다 당신이 세트 반복으로 각에 대한 Folder/Image에 액세스 할 수있는시기 , 일반적인 외래 키를 통해.

그러나 일반 외래 키에 액세스 할 때마다 새 쿼리를 발행해야하기 때문에 데이터베이스 쿼리 측면에서 비용이 많이 듭니다.