2011-05-23 67 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参数。