2011-05-23 70 views
4

我有2個模型類別和項目。一個項目有一個對類別的引用。排序Django中的相關對象

class Category(models.Model): 
    name = models.CharField(max_length=32) 

class Item(model.Models): 
    name = models.CharField(max_length=32) 
    category = models.ForeignKey(Category) 
    sequence = models.IntegerField() 

序列字段應該捕獲類別內的項目序列。

我的問題是:什麼 元選擇我需要的類別和/或項目的集合,這樣當我做的:

category.item_set.all() 

,我得到其序列號排序的項目。

PS:我現在意識到一個名爲ordering_with_respect_to的元選項,但它仍然不清楚它是如何工作的,並且我在序列列中還有遺留數據。如果正確的方法需要,我願意進行數據遷移。

回答

6

什麼你要找的是:

class Item(model.Models): 
    name = models.CharField(max_length=32) 
    category = models.ForeignKey(Category) 
    sequence = models.IntegerField() 

    class Meta: 
     ordering = ['sequence',] 

這將確保Item s的總是sequence訂購。

3
category.item_set.all().order_by('sequence') 
+0

有沒有辦法設置默認排序,以便我不必每次都手動排序呢? – arustgi 2011-05-23 15:54:25

+0

謝謝Uko。您建議的order_with_respect_to是否位於類別模型或項目模型中? – arustgi 2011-05-23 16:02:59

+0

對不起,現在是正確的 – 2011-05-23 16:04:14

0

有點兒晚了,以前的答案沒有解決我的具體問題,但他們使我的答案,所以我會扔這:

我需要我的prefetch_related對象只專門整理一個觀點,所以改變默認順序是不好的(也許model_manager會這樣做,IDK)。但我發現this in the docs

我有以下型號:

class Event(models.Model): 
    foo = models.CharField(max_length=256) 
    .... 

class Session(models.Model): 
    bar = models.CharField(max_length=256) 
    event = models.ForeignKey(Event) 
    start = models.DateTimeField() 
    .... 

    class Meta: 
     ordering = ['start'] 

現在,在一個特定的觀點,我想看到所有的Event S,但我想以相反的順序它們Session S,即ordering = ['-start']

所以我正在做這個視圖的get_queryset()

from django.db.models import Prefetch 
session_sort = Session.objects.all().order_by('-start') 
prefetch = Prefetch('sessions', queryset=session_sort) 
events = Event.objects.all().prefetch_related(prefetch) 

希望它有助於某人!

*順便說一句,這只是一個簡化版本,在我的實際使用案例中有一堆過濾器和其他prefetch_related參數。