Порядок сортировки по умолчанию в модели 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)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, написанного до 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',)