2011-04-08 5 views
4

아래에 표시된 범주와 같은 모델에 의해 주어진 트리를 직렬화하는 간단한 방법이 있습니까?Django에서 트리를 직렬화하기

[ { 'name': 'cat1', 
    'children': [ { 'name': 'cat11', 
        'children': [ ... ] 
       ] 
    } 
    ... 
] 

감사

class Category(MPTTModel): 
    name = models.CharField(max_length=50, unique=True) 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children') 
    order_key = models.IntegerField() 

    class Meta: 
     verbose_name_plural = 'Categories' 

    class MPTTMeta: 
     order_insertion_by = ['order_key'] 

    def __unicode__(self): 
     return "%s" %(self.name) 

답변

5

나는 나무를 걷고 JSON을 사용하여 직렬화하는 객체를 만들어야한다고 생각한다. 나는 그렇지 않다면 더 복잡해지기 때문에 나무가 비순환 적이라고 가정하고 있습니다. 나는이 테스트를하지 않은,하지만 이런 일이 (당신이 사이클이없는 확신만큼) 작동합니다 : children_set이를 얻을 수있는 올바른 방법 인 경우

def serialize_to_json(self): 
    return json.dumps(self.serializable_object()) 

def serializable_object(self): 
    "Recurse into tree to build a serializable object" 
    obj = {'name': self.name, 'children': []} 
    for child in self.get_children(): 
     obj['children'].append(child.serializable_object()) 
    return obj 

(기억할 수를 아이들의 목록. 이것이 틀린 지 논평 해주세요.)

+0

고마워요. 덤프 대신 덤프를 사용하고 children_set.all() 대신 get_children()을 사용합니다. – jul

+0

그 강아지를 목록 이해력으로 바꾸지 않는 이유는 무엇입니까? –

+1

가독성, 그것은 코드를 읽기가 어려운 긴 줄일까요? –

0

어쩌면 Tasypie 또는 장고 - 피스톤이 도움이 될 수 있습니다

내가 좋아하는 JSON 개체가 좀하고 싶습니다? 그렇지 않다면 소스 코드를보고이를 수행하는 방법에 대한 힌트를 얻을 수 있습니다.