Почему мой запрос Django к базе данных Postgres возвращает набор запросов в обратном порядке
У меня есть модель под названием "Step", которая связана с учебным руководством через внешний ключ. В моем файле views.py я просто запрашиваю шаги, используя следующее
learning_guides_steps = learning_guide.step_set.all()
а в шаблонах я просто перебираю шаги с помощью цикла for и отображаю название шагов следующим образом
{%for step in learning_guides_steps%}
<div class="entire_step">
<!-- Displaying the title of the step with an angle down button beside the title -->
<div class = "btn-group step" >
<a href = "#" class = "btn stepname" role = "button" style = "font-size: 18px;"> {{forloop.counter}}. {{step.title}}</a>
</div>
</div>
Однако когда я отображаю его на сайте, он печатается в обратном порядке. Может ли кто-нибудь объяснить, почему это происходит и как я могу это исправить? Я новичок в Django и Postgres, поэтому буду благодарен за любую помощь. Спасибо. Моя модель Step и представления приведены ниже
class Step(models.Model):
title = models.CharField(max_length=200, null=False)
step_description = models.TextField(max_length=1000, null=False)
# enforces one-to-many relationship between LearningGuide and Step.
# Deleting a LearningGuide deletes all the associated steps (CASCADE delete)
learning_guide = models.ForeignKey(LearningGuide, on_delete=models.CASCADE)
Мой файл views.py:
learning_guide = LearningGuide.objects.get(pk=learning_guide_id)
learning_guides_indicators = learning_guide.indicators.all()
indicators = Indicator.objects.all()
learning_guides_steps = learning_guide.step_set.all()
context = {
'learning_guide': learning_guide,
'indicators': indicators,
'learning_guides_indicators':learning_guides_indicators,
'learning_guides_steps':learning_guides_steps,
'homepage':False
}
Вариант 1 (вероятно, самый простой)
.
Упорядочьте результаты запроса в представлении, используя order_by:
learning_guides_steps = learning_guide.step_set.all().order_by('step__title')
# OR to order in the opposite direction,
learning_guides_steps = learning_guide.step_set.all().order_by('-step__title')
Обратите внимание, что я предполагаю, что вы хотите упорядочить по названию шага, но вы можете упорядочить по любому другому полю, просто заменив title в order_by, например order_by('step__pk') если вы хотите упорядочить по первичному ключу шага. Обратите внимание, что - в каждом случае меняет направление. И обратите внимание на двойное подчеркивание между step и title step__title, потому что вы упорядочиваете по внешнему ключу.
Вариант 2. Установите упорядочивание по умолчанию в самой модели с помощью класса Meta:
class Step(models.Model):
title = models.CharField(max_length=200, null=False)
step_description = models.TextField(max_length=1000, null=False)
learning_guide = models.ForeignKey(LearningGuide, on_delete=models.CASCADE)
class Meta:
ordering = ['title']
# OR in the other direction
ordering = ['-title']
Для этого вам потребуется выполнить python manage.py makemigrations и python manage.py migrate
Вариант 3
.
Добавьте поле порядка к шагу и упорядочивайте по нему. Таким образом, вы можете установить порядок, а не упорядочивать по алфавиту или по автоматически сгенерированному первичному ключу:
class Step(models.Model):
title = models.CharField(max_length=200, null=False)
order = models.PositiveIntegerField(default=1)
step_description = models.TextField(max_length=1000, null=False)
learning_guide = models.ForeignKey(LearningGuide, on_delete=models.CASCADE)
class Meta:
ordering = ['order']
ordering = ['-order']
Обратите внимание, что этот третий вариант также потребует от вас выполнения python manage.py makemigrations и python manage.py migrate. Я добавил значение по умолчанию 1 к порядку, чтобы миграция не жаловалась на значение NULL, но это означает, что ВСЕ шаги будут иметь порядок 1, пока вы его не измените. Есть способ обойти это, но я думаю, что это сработает.