序列化模型列表时,获取“ QuerySet”对象没有属性“ _meta”错误

时间:2019-04-29 11:52:43

标签: python django python-3.x

我了解这条错误消息

  

“ 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)

编辑

这是我打算修改列表的另一个视图:

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,并显示下一个问题ID。我的意图是通过维护会话中的问题列表来跟踪当前问题。

对于我做错了什么以及正确的解决方法,我将非常感激。

1 个答案:

答案 0 :(得分:0)

Daniel Roseman在评论中已经指出:

  顾名思义,

model_to_dict需要一个模型,而不是查询集。

如果要将模型实例转换为dict,则可以使用instance.__dict__

但是,对于整个QuerySet,您可以通过一个简单的循环获取字典列表:

questions_by_category = [question.__dict__ for question in questions_by_category]

尽管我不确定您是否可以对输出进行JSON序列化,还是将整个内容保存到会话中是个好主意。