未指定 base_name 参数,并且无法从视图集中自动确定名称,因为它没有 .queryset 属性
Posted
技术标签:
【中文标题】未指定 base_name 参数,并且无法从视图集中自动确定名称,因为它没有 .queryset 属性【英文标题】:base_name argument not specified, and could not automatically determine the name from the viewset, as it does not have a .queryset attribute 【发布时间】:2018-07-10 22:39:40 【问题描述】:问题是这样的: 我正在尝试替换 标准查询集:
queryset: MyModel.objects.all()
在我的:
def get_queryset(self, username=None):
if username is not None:
user = UserModel.objects.get(username=username)
queryset = MyModel.filter(author=user)
return queryset
else:
queryset = MyModel.objects.all()
return queryset
当我删除“queryset”,只留下“get_queryset”时,出现错误:
AssertionError:
base_name
参数未指定,并且无法从视图集中自动确定名称,因为它没有.queryset
属性。
整体看起来是这样的:
class MyModelView(viewsets.ModelViewSet):
permissions_classes = (permissions.IsAuthenticated,)
serializer_class = MyModelleSerializer
def get_queryset(self, username=None):
if username is not None:
user = UserModel.objects.get(username=username)
queryset = MyModel.filter(author=user)
return queryset
else:
queryset = MyModel.objects.all()
return queryset
lookup_field = 'username'
lookup_value_regex = '[a-zA-Z0-9$&(._)\-]+'
那么如何正确覆盖方法?
【问题讨论】:
如果您像我一样决定手动输入 github 上示例中的 urls.py 代码,您也会收到此错误;我不小心将 UserViewSet 写为字符串('UserViewSet'),而不是引用在同一文件中定义的对象,如下面的 Rahmonov 所述。 【参考方案1】:在最新的 DRF 中,如果您没有定义 queryset
,则需要在您的视图集 url 中显式设置 base_name
。
所以,这样的事情应该会很好:
router.register(r'my-model/', MyModelView, basename='MyModel')
看到这个:docs 希望对您有所帮助。
【讨论】:
【参考方案2】:您必须在 url.py 文件中为 register 方法添加一个名为 basename
的参数,如 url.py 中的以下代码:
"In url.py"
...
from rest_framework import routers
router = routers.DefaultRouter()
router.register(r'my-model/' , MyModelView , basename='MyModel')
urlpattern=[...]
【讨论】:
“basename”不是“base_name”【参考方案3】:您需要在您的 url conf 中设置 basename
属性。 Docs here
【讨论】:
以上是关于未指定 base_name 参数,并且无法从视图集中自动确定名称,因为它没有 .queryset 属性的主要内容,如果未能解决你的问题,请参考以下文章
无法配置数据源:未指定“url”属性并且无法配置嵌入式数据源。春天
无法配置数据源:未指定“url”属性,并且无法配置嵌入式数据源。原因:发