Django: Порядок по умолчанию, основанный на значениях и количестве связанных полей «многие ко многим» - PullRequest
2 голосов
/ 25 января 2011

Модели выглядят следующим образом:

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 голосов
/ 26 января 2011

Вы можете указать поля модели только в Meta.ordering , поэтому, если вы хотите реализовать описанную логику, вам придется прибегнуть к custom manager .

* 1006.* EDIT:

Вы можете добавить какое-либо поле weight к вашей Stop модели, обновить это поле вместе с обновлением days_open, и тогда вы сможете использовать ordering = ['-weight ']

Кроме того, что-то подобное может соответствовать вашим целям:

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

- конечно, для этого потребуется добавить поле weight к модели Weekday ипредварительно заполнив его для всех записей.Это также может быть реализовано как метод в пользовательском менеджере, о котором я упоминал выше.

...