Порядок сортировки по умолчанию в модели Django с использованием связанного поля таблицы

Можно ли установить порядок сортировки по умолчанию для модели на поле из связанной модели (а не на целочисленный ключ), то есть что-то, что дает предложение SQL order by с полем из обеих моделей? Если да, то как? Я могу сделать это через query_by, но не могу понять, как установить его по умолчанию. Спасибо.

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    class Meta:
        ordering = ('bar_date', 'related.name', )

Ответов (6)

Взгляните на порядок по отношению к .

class Question(models.Model):

  question_text=models.CharField(max_length=200)
        class Meta:
    verbose_name_plural="  Question"

class Choice(models.Model):

  question=models.ForeignKey(Question,on_delete=models.CASCADE)
    class Meta:
    verbose_name_plural=" Choice"

Либо вы можете изменить количество пробелов перед именем класса, как указано выше, либо заказать его, используя числа, как показано ниже:

class Question(models.Model):

  question_text=models.CharField(max_length=200)
        class Meta:
    verbose_name_plural="1.Question"

class Choice(models.Model):

  question=models.ForeignKey(Question,on_delete=models.CASCADE)
    class Meta:
    verbose_name_plural="2.Choice"

В современной версии django это:

class Meta:
        ordering = ['word']

хм ... Я решаю аналогичную вещь при апфакторинге старого приложения django, написанного до qs-rf, где, вероятно, использовалась "точечная" нотация ??? ... мне потребовалось несколько часов, чтобы выделить "что-то", и я все еще НЕ уверен, но ... попробуйте заменить точку на "__" (двойное подчеркивание), это может помочь ... На самом деле, я все еще НАДЕЖДА ТОЖЕ :-)))

@stuart: для "order_with_respect_to" я прочитал кое-что об автоматически добавленном поле физической модели в дочернюю таблицу ... Я не совсем понимаю, как здесь обстоят дела ... Документация IMHO очень плохо описывает синтаксис упорядочивания, как!

без комментариев :-) http://code.djangoproject.com/ticket/8975

в любом случае, мне нравится Django, но ... :-))

В качестве альтернативы order_with_respect_to (который поддерживает только одно поле) вы можете использовать настраиваемый менеджер для упорядочивания. Это также позволяет вам упорядочивать несколько полей в Foo и по-прежнему иметь обычный менеджер Bar.objects. Вам нужно будет сначала проверить, применяется ли порядок Meta.ordering или настраиваемый менеджер.

class FooSortedManager(models.Manager):
    def get_query_set(self):
        return super(FooSortedManager, self).get_query_set().order_by('foo__name')

class Foo(models.Model):
    name = models.CharField(max_length=50)

class Bar(models.Model):
    related = models.ForeignKey(Foo)
    bar_date = models.DateField()

    foo_sorted = FooSortedManager()

    class Meta:
        ordering = ('bar_date',)

Я использую django 1.2.7 и вместо подключения ForeignKey.Attribute мы должны использовать «__», поэтому этот код будет работать:

class Meta:
    ordering = ('bar_date', 'related__name', )