请稍等 ...
×

采纳答案成功!

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

GoodsListViewSet删除queryset属性导致错误

在《drf的过滤》这一课一开始,老师介绍道def get_queryset(self):函数可以替代queryset属性,因为函数本身会返回一个queryset。随后在老师演示的试验里,引入get_queryset函数,删除queryset属性后,可以正常运行。

可是当我做同样试验时,代码如下:

class GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
        """
        商品列表页
        """
        #queryset = Goods.objects.all()
        serializer_class = GoodsSerializer
        def get_queryset(self):
                return Goods.objects.filter(shop_price__gt=100)

运行提示如下错误:

File "/home/manager/.virtualenvs/py36env/lib/python3.6/site-packages/rest_framework/routers.py", line 148, in get_default_base_name

    assert queryset is not None, '`base_name` argument not specified, and could ' \

AssertionError: `base_name` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.

说在断言queryset不是None时失败,那么必须显性定义queryset属性了?是不是rest_framework代码升级了,比Bobby老师用的那个版本的rest_framework新增了这个断言?

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

3回答

痕六 2018-01-31 15:05:26

如果不用queryset属性,需要在router里面添加一个base_name参数

router.register('goods', GoodsListViewSet, base_name='goods_list')

这个类似我们常规定义url的时候里面的name参数

path('goods/', goods_list, name='goods_list')  # 这个name, 用于反向解析之类的

因为viewset会根据queryset属性里面的查询集默认生产一个goods-list或者goods-detail的base_name

3 回复 有任何疑惑可以回复我~
bobby 2018-01-25 10:52:03

你可以试试楼下同学的方法

0 回复 有任何疑惑可以回复我~
  • 那么老师,到底是不是应该在自定义了get_queryset方法后,就删除queryset = Goods.objects.all()这一句呢。视频里面你是删除的,我们运行报了错,只有把他加回来才不报错。是不是您的视频drf版本跟我们的不一样呢?
    回复 有任何疑惑可以回复我~ 2018-01-26 13:48:56
  • 这个问题需要确定一下新版本是否造成了这个问题
    回复 有任何疑惑可以回复我~ 2018-01-29 15:54:16
慕粉0243397241 2018-01-23 23:47:10

同样遇到这个问题,把删除的代码

queryset = Goods.objects.all()


补上就没问题了。同样怀疑版本更新的问题

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号