报错解决:AssertionError: `basename` argument not specified, and could not automatically determine the name from the viewset, as it does not have a `.queryset` attribute.
因为对应的视图函数没有获取数据库数据,比如这种:
queryset = models.News.objects.filter(deleted=False).order_by('-id')
如果获取了数据库数据,代码就会默认的拿数据对象名字的小写,然后放在url处,源码如下:
def get_default_basename(self, viewset):
"""
If `basename` is not specified, attempt to automatically determine
it from the viewset.
"""
queryset = getattr(viewset, 'queryset', None)
assert queryset is not None, '`basename` argument not specified, and could ' \
'not automatically determine the name from the viewset, as ' \
'it does not have a `.queryset` attribute.'
return queryset.model._meta.object_name.lower()
所以解决方法就是我们自己在url中定义一个名字,例如:
原:router.register(r'register', account.RegisterView)
现:router.register(r'register', account.RegisterView, 'register')
再次运行就不报错了。
补充:通过名字反向生成url部分的Basename,就是我们刚定义的url的名字
name='{basename}-list',
name='{basename}-{url_name}',
name='{basename}-detail',