base_name参数未指定,并且无法自动确定视图集中的名称,因为它没有.queryset属性

woe*_*ev. 16 django-views python-3.x django-rest-framework

问题是这样的:我正在尝试替换标准的查询集:

queryset: MyModel.objects.all()
Run Code Online (Sandbox Code Playgroud)

在我身上:

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
Run Code Online (Sandbox Code Playgroud)

当我删除"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$&(._)\-]+'
Run Code Online (Sandbox Code Playgroud)

那么如何正确覆盖方法?

Jah*_*nov 39

在最新的DRF中,base_name如果您没有queryset定义,则需要在视图集URL中明确设置.

所以,这样的事情应该做得很好:

router.register(r'my-model/', MyModelView, basename='MyModel')
Run Code Online (Sandbox Code Playgroud)

看到这个:docs 希望它有所帮助.


小智 8

您必须basename在 url.py 文件中添加一个为 register 方法调用的参数,就像 url.py 中的以下代码:

"In url.py"
    
    
...
    
from rest_framework import routers
       
router = routers.DefaultRouter()
router.register(r'my-model/' , MyModelView , basename='MyModel')  
urlpattern=[...]     
Run Code Online (Sandbox Code Playgroud)

  • “基本名称”而不是“基本名称” (3认同)