2009-07-21 3 views
1

고전적인 문제가있을 수 있지만이를 수행 할 수있는 스 니펫을 찾지 못했습니다.django - 방법에 의한 QuerySet 재귀 순서

전체 이름으로이 모델을 정렬하고 싶습니다. 나는 "부모"에 의해 정렬 시도

class ProductType(models.Model): 
    parent = models.ForeignKey('self', related_name='child_set') 
    name  = models.CharField(max_length=128) 

    def get_fullname(self): 
     if self.parent is None: 
      return self.name 
     return u'%s - %s' % (unicode(self.parent), self.name) 
    fullname = property(get_fullname) 
  1. 무한 루프 오류을 얻었다. "parent__id"는 잘 정렬되지 않았습니다.

  2. 문자열 필드를 연결하는 데 annotate()을 사용하는 방법을 이해하지 못했습니다.

  3. 나는 분류 ()와 사용자 정의 관리자를 추가,하지만 그것은 목록 개체를 반환하고 일을 내 forms.ModelChoiceField을 방지 할 수 있습니다.

여기 정렬

def all(self): 
    return sorted(super(ProductTypeManager, self), key=lambda o: o.fullname) 

djangonic 정글에서 다른 어떤 존재입니까? 도움 주셔서 감사합니다.

답변

0

이 작동 할 수 있습니다 : 나는 아마에 denomalised 필드와 순서를 만들 것

ProductType.objects.alL().order_by('parent__name', 'name') 
+0

이상하게 행동합니다. order_by ('parent__id')와 같습니다. – leplatrem

+0

"이상하게 행동하는"의미는 정확히 무엇입니까? 그것이 틀린 특정 일로 질문을 업데이트 할 수 있습니까? –

+0

나는 그것이 잘 정렬되지 않는다는 것을 의미했다 : http://pastebin.com/m3af438ac 일치하지 않는 것으로 알려져있다 : http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

2

. 기본 설정에 따라 .save()를 재정의하거나 신호를 사용하여 비정규 화 된 필드를 포화시킬 수 있습니다.

class ProductType(models.Model): 
    parent = models.ForeignKey('self', related_name='child_set') 
    name  = models.CharField(max_length=128) 
    full_name  = models.CharField(max_length=128*4) 

    def save(self, *args, **kwargs): 
     if not full_name: 
      self.full_name = self.get_fullname() 
     super(ProductType, self).save(*args, **kwargs) 


    def get_fullname(self): 
     if self.parent is None: 
      return self.name 
     return u'%s - %s' % (unicode(self.parent), self.name) 

그런 다음 full_name

0
.

나는 위에 언급 한 경로를 확실히 탐색 할 것입니다 :

ProductType.objects.order_by('parent__name', 'name') 

왜 무한 루프로 오류가 발생합니까? 예제 데이터가 자신을 참조합니까?

+0

장고 예외 : http://code.djangoproject.com/browser/django/trunk/django/db/models/sql/query.py?rev = 11274 # L1012 여기에서 신속하게 설명합니다 : http://code.djangoproject.com/ticket/7101#comment:1 – leplatrem

1

또는, 수행하려는 작업이 트리 구조를 생성하는 것이라면 django-mptt을 살펴보십시오. 또한 수동으로 설정된 순서로 주문할 수도 있습니다.

관련 문제