python-3.x 未指定base_name参数,无法从视图集中自动确定名称,因为它没有.queryset属性

mzsu5hc0  于 2022-12-27  发布在  Python
关注(0)|答案(4)|浏览(113)

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

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"时,出现错误:
Assert错误:未指定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$&(._)\-]+'

那么如何正确地重写方法呢?

ejk8hzay

ejk8hzay1#

在最新的DRF中,如果没有定义queryset,需要在视图集url中显式设置base_name
所以,像这样的东西应该会有好处:

router.register(r'my-model/', MyModelView, basename='MyModel')

请参见:docs

voase2hg

voase2hg2#

必须为www.example.com文件中的register方法添加一个名为basename的参数url.py,类似于url.py中的以下代码:

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

zbdgwd5y3#

您需要在您的url conf.Docs中设置basename属性

8zzbczxx

8zzbczxx4#

在我的例子中,我使用了Rest Framework默认路由器,并将视图名称更改为与模型名称完全匹配,从而解决了这个问题。
查看:

class DailyQuote(ModelViewSet):
   queryset = DailyQuote.objects.all()
   serializer_class = DailyQuoteSerializer

型号:

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

因此只需将MyModelView更改为Model即可。

相关问题