Почему мой запрос 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, пока вы его не измените. Есть способ обойти это, но я думаю, что это сработает.

Вернуться на верх