在Django中排序相关对象

时间:2011-05-23 15:28:03

标签: django django-models

我有2个型号分类和项目。项目引用了类别。

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()

序列字段应该捕获类别中Item的序列。

我的问题是: 我需要在类别和/或项目上设置什么元选项,以便我这样做:

category.item_set.all()

我按照序列号排序的项目。

PS:我现在知道一个名为ordering_with_respect_to的元选项..但它仍然不清楚它是如何工作的,而且我在序列列中也有遗留数据。如果正确的方法需要,我愿意接受数据迁移。

3 个答案:

答案 0 :(得分:6)

您正在寻找的是:

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

    class Meta:
        ordering = ['sequence',]

这将确保Item始终按sequence排序。

答案 1 :(得分:3)

category.item_set.all().order_by('sequence')

答案 2 :(得分: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)

希望它有所帮助!

* BTW,这只是一个简化版本,在我的实际使用案例中有一堆过滤器和其他prefetch_related参数。