2012-05-01 47 views
0
class Dog(models.Model): 
    name = models.CharField(max_length=255) 
    toys = models.ManyToManyField('toys.Toy', through='dogs.DogToy') 


class DogToy(models.Model): 
    dog = models.ForeignKey('dogs.Dog') 
    toy = models.ForeignKey('toys.Toy') 
    sort_order = models.IntegerField() 

    class Meta: 
     unique_together = (
      ('dog', 'toy'), 
      ('dog', 'sort_order'), 
     ) 

使用上面的例子,我想用關係的sort_order列,因爲多個狗可能具有相同的玩具訂購dog.toys.all(),所以我不能排序上Toy的字段。查詢後我不能使用Pythonic排序,因爲我的狗有成千上萬的玩具,而且我需要使用分頁來表現。使用Django(或簡單的SQL) - 是否可以對`through`表中的字段對m2m關係進行排序?

已經有一些重複的問題和幾乎重複的問題已被回答錯誤(答案相當於只使用dog.toys.order_by('sort_order'),這當然不起作用)。

+2

hmmmm,不知道,但像dog.toys.all()ORDER_BY( 'dogtoy__sort_order')可以做的伎倆...... – Jingo

+0

@Jingo。我認爲這是正確的做法。接受的答案將在初始查詢時觸及數據庫一次,然後再爲每個**'dogtoy.toy'_再次觸發數據庫。它可以通過在查詢中使用'.select_related('toy')'來緩解,但應該像您的建議那樣直接轉換爲簡單的東西。 – Izkata

回答

1

不必通過中間表DogToy:

dog = Dog.objects.get(...) 
ordered_toys = [dogtoy.toy for dogtoy in \ 
    DogToy.objects.filter(dog=dog).order_by('sort_order')] 
相關問題