2013-06-27 8 views
1

나는 흥미로운 문제에 직면하고있다. 문제가 있는지 알지 못하지만 필요한 예상 값을 제공하지 못한다. 여기 예를 들어 두 모델이 있습니다.ManyToManyField를 올바른 순서로 추가

class Name(models.Model): 
    """ """ 
    name = models.CharField(max_length=20) 


class Dir(models.Model): 
    name = models.ForeignKey(Name) 
    children = models.ManyToManyField('Dir', null=True, blank=True, related_name="dirs") 

예를 들어, 어린이 'A', 'B'에 두 개의 디렉토리를 추가했습니다. 이제 저는 두 아이를 제가 추가 한 순서대로 되찾고 싶습니다. 그러나 문제는 그것이 아래의 순서대로 나를 제공하고 있다는 것이다. 'B', 'A'. 내가 추가 한 것과 정확히 같은 순서로 유지하는 방법?

+0

Django는'm2m' 필드의 경우 삽입 순서 보존을 보장하지 않으므로'through' 테이블을 작성하고 거기에 순서를 정의해야합니다. –

+0

감사합니다. 그러나 모델과 그 아이들이 같은 이름 인 'Dir'을 가지고 어떻게 사용할 수 있습니까? 나는 시도했다. 그러나 만드는 법을 정말로 이해할 수 없다. – user968677

+0

시도해 보셨습니까? '클래스 DirEntry (models.Model) :' '부모 = models.ForeignKey (DIR)' '아이 = models.ForeignKey (DIR)' '순서 = models.IntegerField()' 그러나 나에게있어'Through '를 가진'ManyToManyField'는 너무 많은 한계를 가지고있다. 'add()','create()'메쏘드, 그리고 관리자는 작동하지 않을 것입니다. (필터를 사용하여'Dir.objects'를 재정의하는 것을 의미합니다) - 외래 키에 의한 중간 모델을 사용하는 것이 더 낫습니다. – HighCat

답변

-1

당신은 관계 식별자로 디렉토리를 주문할 수있다 :

parent = Dir(name='parent') 
parent.dirs.add(Dir(name='A')) 
parent.dirs.add(Dir(name='B')) 
children = Dir.dirs.all().order_by('id') # or '-id' if you need reverse order. 

당신이 중간 테이블을 정의하는 through 속성을 사용하는 경우에만.

+1

삽입 ID는 때때로 모델 구조에서 예상되는 결과를 제공하지 않지만 좋은 힌트였습니다. 감사합니다. 이제는 내 자신의 'dir_id'필드를 정의하고 값을 삽입하는 동안 값을 올바른 순서로 지정합니다. 이제 올바른 결과를 볼 수 있습니다. – user968677

+0

삽입 순서를 알기 위해 중개 모델에 created = models.DateTimeField (auto_now_add = True)를 사용했습니다. 그럼 .order_by ('created')를 사용할 수 있습니다. –

관련 문제