Массив JSON не в порядке

#python #json #reactjs #django #rest

#python #json #reactjs #django #отдых

Вопрос:

У меня есть приложение React / Django, в котором пользователи могут отвечать на вопросы с несколькими вариантами ответов. У меня есть массив «choices», отображаемый в пользовательском интерфейсе в этом точном порядке.

     {
        "id": 2,
        "question_text": "Is Lebron James the GOAT?",
        "choices": [
            {
                "id": 5,
                "choice_text": "No",
                "votes": 0,
                "percent": 0
            },
            {
                "id": 4,
                "choice_text": "Yes",
                "votes": 1,
                "percent": 100
            }
        ],
    }
  

Когда я выбираю выбор в режиме разработки, я отправляю запрос в Django, чтобы увеличить счетчик голосов для этого выбора, и он отправит ответ с обновленными голосами в том же порядке. порядок. Когда я пытаюсь выбрать вариант в рабочем режиме с помощью сборки npm run, порядок переключается.

     {
        "id": 2,
        "question_text": "Is Lebron James the GOAT?",
        "choices": [
            {
                "id": 4,
                "choice_text": "Yes",
                "votes": 1,
                "percent": 50
            },
            {
                "id": 5,
                "choice_text": "No",
                "votes": 1,
                "percent": 50
            }
        ]
    }
  

Я думал, что порядок массива JSON должен быть сохранен. Кто-нибудь может объяснить, почему это происходит? Я почти уверен, что эта проблема возникает из Django. Вот представление функции в Django.

 @api_view(['POST'])
def vote_poll(request, poll_id): 
    if request.method == 'POST':
        poll = Poll.objects.get(pk=poll_id)

        selected_choice = Choice.objects.get(pk=request.data['selected_choice_id'])
        selected_choice.votes  = 1
        selected_choice.save()
        poll_serializer = PollAndChoicesSerializer(poll)
        return Response({ 'poll': poll_serializer.data })
  

Ответ №1:

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

 class Choice(Smodels.Model):
  class Meta:
    ordering = ['-id']
  

Из документов:

Предупреждение

Упорядочение не является бесплатной операцией. Каждое поле, которое вы добавляете в порядок, влечет за собой затраты для вашей базы данных. Каждый добавляемый вами внешний ключ также будет неявно включать все его порядки по умолчанию.

Если в запросе не указан порядок, результаты возвращаются из базы данных в неуказанном порядке. Конкретный порядок гарантируется только при упорядочении по набору полей, которые однозначно идентифицируют каждый объект в результатах. Например, если поле имени не уникально, упорядочение по нему не гарантирует, что объекты с одинаковым именем всегда будут отображаться в одном и том же порядке.