请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

ListView 下使用 get_queryset() 方法,为什么模型类的所有方法都不可用了?

老师你好:

我在 ListView 下使用 get_queryset() 方法,为什么模型类的所有方法都不可用了?
模型类的字段全部都是可以调用的。

class QuestionListView(ListView):
    """ Question list page view """
    model = QuestionModel
    paginate_by = 100
    context_object_name = 'question_list'
    template_name = 'question/list.html'

    def get_queryset(self):
        super_queryset = super(QuestionListView, self).get_queryset()
        queryset = super_queryset.filter(status=QuestionModel.OPEN).values('title', 'viewed', 'slug', 'updated_at') \
            .order_by('-updated_at')
        return queryset

正在回答 回答被采纳积分+3

2回答

提问者 幕布斯3520075 2021-11-21 23:18:16

类似:

    

get_absolute_url
total_votes
get_answers
count_answers

模型类的方法都调用不出来,字段可以正常显示。

1 回复 有任何疑惑可以回复我~
  • Jack #1
    您好,你说的方法都调用不出来是啥意思呢?访问时的报错内容能截图一下吗
    回复 有任何疑惑可以回复我~ 2021-11-22 16:33:29
  • 提问者 幕布斯3520075 回复 Jack #2
    您好,老师:
    就是模型类的所有方法,在模板中不显示,也不报任何错误,但是上面 values 中的 字段可以正常显示。
    如果在类视图中不用 "get_queryset" 方法, 则一切正常。
    回复 有任何疑惑可以回复我~ 2021-11-22 23:02:57
Jack 2021-11-23 14:13:33

你想对问题这样过滤

.filter(status=QuestionModel.OPEN).values('title', 'viewed', 'slug', 'updated_at') \            .order_by('-updated_at')

可以在模型类文件的QuestionQuerySets中写一个方法

https://img1.sycdn.imooc.com//szimg/619c85ae09c67b0813041092.jpg

然后重写querysets的时候这样子调用


你的写法中“super_queryset = super(QuestionListView, self).get_queryset()”这里是继承了原始的get_queryset()函数的功能,而不是重写。

0 回复 有任何疑惑可以回复我~
  • 提问者 幕布斯3520075 #1
    上面刚刚全部都试过了,只要用到了 'values()' 方法进行优化,模型类中自定义的方法,铁定会失效也不报错;
    优化的几个模型字段都可以正常显示;
    
    无论是继承还是重写 get_queryset() 方法,都一样。
    回复 有任何疑惑可以回复我~ 2021-11-23 19:42:46
  • 提问者 幕布斯3520075 #2
    无论怎么写,只要去掉 values() 方法,全部恢复正常。
    回复 有任何疑惑可以回复我~ 2021-11-23 19:48:06
  • 提问者 幕布斯3520075 #3
    老师,values() 方法返回的是一个类似dict的查询集,是否因为它迭代时返回字典而不是模型实例对象,所以模型的所有自定义方法都不可用。
    回复 有任何疑惑可以回复我~ 2021-11-23 20:23:31
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信