GoodsListViewSet删除queryset属性导致错误

来源:5-11 drf的过滤

慕数据957128

2018-01-23

在《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回答

痕六

2018-01-31

如果不用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
1
精慕门6218918
怎么那么厉害你:)
2020-04-20
共1条回复

bobby

2018-01-25

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

0
2
bobby
回复
慕粉0243397241
这个问题需要确定一下新版本是否造成了这个问题
2018-01-29
共2条回复

慕粉0243397241

2018-01-23

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

queryset = Goods.objects.all()


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

0
0

Python前后端分离开发Vue+Django REST framework实战

Django REST framework课程视频,RESTFul API前后端分离开发

2873 学习 · 2457 问题

查看课程