Django:基于多对多关系字段值及计数的默认排序

2 投票
1 回答
948 浏览
提问于 2025-04-16 10:36

模型看起来像这样:

class Weekday(models.Model):
    '''
    >>> for w in Weekday.objects.all():
    ...  print w
    ...
    Sunday
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    '''
    name = models.CharField(max_length=9)

    def __unicode__(self):
        return self.name 

class Stop(models.Model):
    class Meta:
        ordering = ????

    name = models.CharField('Stop name', max_length=32)
    days_open = models.ManyToManyField(Weekday)

我想要的排序方式是:

  1. 所有包含7天的内容
  2. 所有包含星期天的内容
  3. 所有包含星期一的内容
  4. 等等等等。(如果有相同的情况,先比较工作日的数量,然后再比较停靠点的名称)

有没有人能给点建议,应该怎么处理这个问题?这个排序应该在管理器里做吗?还是说有更简单的方法可以做到?

谢谢大家!

1 个回答

2

在Django中,你只能在Meta.ordering里指定模型的字段。如果你想实现你描述的那种逻辑,就需要使用自定义管理器

编辑:

你可以在你的Stop模型中添加一个weight字段,更新这个字段的同时也更新days_open,这样你就可以使用ordering = ['-weight']来排序了。

另外,像下面这样的做法也许适合你的需求:

Stop.objects.annotate(weight=models.Sum('weekday__weight')).order_by('-weight')

当然,这样做需要在Weekday模型中添加weight字段,并且要为所有记录预先填充这个字段。这个功能也可以作为我之前提到的自定义管理器中的一个方法来实现。

撰写回答