base_name参数未指定,并且无法从viewset自动确定名称,因为它没有.queryset属性。

74

我正在尝试替换 标准查询集

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"时会出现错误:

断言错误: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描述的行上定义的对象。 - Katana24
4个回答

162
在最新的DRF中,如果您没有定义queryset,则需要在您的viewset url中明确设置base_name。 因此,像这样做应该是可以的:
router.register(r'my-model/', MyModelView, basename='MyModel')

请查看: 文档


12

在url.py文件的register方法中添加一个名为basename的参数,代码如下:

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

4
"basename" 不是 "base_name"。 - yolabingo

2

0
在我的情况下,我正在使用Rest框架的默认路由器,并将视图名称更改为与模型名称完全匹配来解决这个问题。
视图:
class DailyQuote(ModelViewSet):
   queryset = DailyQuote.objects.all()
   serializer_class = DailyQuoteSerializer

模型:

class DailyQuote(models.Model):
   quote = models.TextField()
   text = models.TextField()

所以只需要将 MyModelView 更改为 Model。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接