При получении объекта 'QuerySet' отсутствует ошибка атрибута '_meta' при сериализации списка моделей - PullRequest
1 голос
/ 29 апреля 2019

Я понимаю это конкретное сообщение об ошибке

Объект 'QuerySet' не имеет атрибута '_meta'

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

Итак, у меня есть список отфильтрованных объектов модели Я получаю из базы данных:

questions_by_category = Question.objects.filter(category=category_id)

Я хочу сохранить этот список в сеансе следующим образом:

request.session["questions"] = json.dumps(model_to_dict(questions_by_category))

но я получаю сообщение об ошибке именно с этой строки:

model_to_dict(questions_by_category)

Это класс модели:

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    correct_answer = models.CharField(max_length=20)
    publication_date = models.DateTimeField('date_published', default=django
                                            .utils.timezone.now)
    question_hint = models.CharField(max_length=200, default='hint')
    question_thumbnail = models.ImageField(upload_to='gallery', height_field=None, width_field=None,
                                           max_length=100,
                                           default='images/pyramid.jpg')
    category = models.ForeignKey(QuestionCategory, on_delete=models.SET_NULL, null=True)
    difficulty_level = models.IntegerField(default=10)

    def was_published_recently(self):
        return self.publication_date >= timezone.now() - datetime.timedelta(days=1)

    class Meta:
        db_table = 'question'

    def __str__(self):
        return self.question_text

    def serialize(self):
        return self.__dict__

А вид:

def question(request, category_name, category_id):
    questions_by_category = Question.objects.filter(category=category_id)
    current_question = questions_by_category.iterator().__next__()
    choice = current_question.choice_set.get()

    form = ChoiceForm(request.POST)

    request.session["questions"] = json.dumps(model_to_dict(questions_by_category))

    context = {
        'question': current_question, 'choice': choice, 'form': form
    }

    return render(request, 'quiz/question.html', context)

EDIT

Это другой вид, где я собираюсь изменить список:

def accept_choice(request):
global data
if request.method == 'POST':
    data = request.POST.get('choiceRadioGroup')
    print('Selected data: ' + str(data))

return render(request, 'quiz/question.html', {'data': 'data'}

Цель (которая начинает казаться запутанной) состоит в том, чтобы выбрать принять выбор из представления вопросов, при следующем нажатии кнопки вызывается accept_choice и отображается идентификатор следующего вопроса. Мое намерение состоит в том, чтобы отслеживать текущий вопрос, ведя список вопросов на сессии.

Я был бы очень признателен, если бы я объяснил, что я делаю неправильно, и правильный способ сделать это.

1 Ответ

0 голосов
/ 29 апреля 2019

Как было сказано Дэниелом Роземаном в комментариях:

model_to_dict, как следует из названия, ожидает модель, а не набор запросов.

если вы хотите преобразовать экземпляр модели в dict, вы можете использовать instance.__dict__.

Однако для всего QuerySet вы можете получить список диктов с помощью простого цикла:

questions_by_category = [question.__dict__ for question in questions_by_category]

хотя я не уверен, сможете ли вы JSON сериализовать вывод или будет хорошей идеей сохранить все это в сеансе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...