Django REST Framework - get_queryset: 'MyModel' 对象没有属性 'model'
Django REST Framework - get_queryset: 'MyModel' object has no attribute 'model'
我在 Django REST 框架中编辑查询集时遇到问题。
基本上我需要过滤我的查询和 return 单个查询,所以我的 DRF 视图如下所示:
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get_queryset(self):
start = self.kwargs['start']
end = self.kwargs['end']
qs, created = MyModel.objects.get_or_create(start=start, end=end)
return qs
所以我 return 单个模型实例,但是当我尝试访问真实的 DRF Web 界面时,我收到一个错误 'MyModel' object has no attribute 'model'
回溯:
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/viewsets.py" in view
85. return self.dispatch(request, *args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
456. response = self.handle_exception(exc)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
444. self.initial(request, *args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in initial
359. self.check_permissions(request)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in check_permissions
304. if not permission.has_permission(request, self):
File "/Users/stay-wide-awake/code/asp/src/apps/api2/permission.py" in has_permission
34. perms = self.get_required_permissions(request.method, queryset.model)
Exception Type: AttributeError at /api/v2/geo/36.606111,-118.062778|36.578581,-120.291994/
Exception Value: 'MyModel' object has no attribute 'model'
路由器和所有其他部件都正常(通过打印测试:))
如有任何提示,我们将不胜感激。
通过 MyModel.objects.get_or_create(start=start, end=end)
收到的 object
不是查询集,因此您会收到此错误。
Django 的 get_or_create()
return 是一个 (object, created)
的元组,其中 object
是检索或创建的对象, created
是一个布尔值,指定是否是一个新对象已创建。
在您的 get_queryset()
方法中,您将查询集 qs
设置为收到的 object
,而实际上它是一个模型对象。
get_queryset()
应该 return 一个 queryset
而不是你正在做的模型对象。
您可以这样做:
def get_queryset(self):
start = self.kwargs['start']
end = self.kwargs['end']
mymodel_obj, created = MyModel.objects.get_or_create(start=start, end=end)
return MyModel.objects.filter(id=mymodel_obj.id) # returns a queryset now
我在 Django REST 框架中编辑查询集时遇到问题。 基本上我需要过滤我的查询和 return 单个查询,所以我的 DRF 视图如下所示:
class MyModelViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MyModelSerializer
def get_queryset(self):
start = self.kwargs['start']
end = self.kwargs['end']
qs, created = MyModel.objects.get_or_create(start=start, end=end)
return qs
所以我 return 单个模型实例,但是当我尝试访问真实的 DRF Web 界面时,我收到一个错误 'MyModel' object has no attribute 'model'
回溯:
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/viewsets.py" in view
85. return self.dispatch(request, *args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
456. response = self.handle_exception(exc)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in dispatch
444. self.initial(request, *args, **kwargs)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in initial
359. self.check_permissions(request)
File "/Users/stay-wide-awake/code/env/lib/python3.4/site-packages/rest_framework/views.py" in check_permissions
304. if not permission.has_permission(request, self):
File "/Users/stay-wide-awake/code/asp/src/apps/api2/permission.py" in has_permission
34. perms = self.get_required_permissions(request.method, queryset.model)
Exception Type: AttributeError at /api/v2/geo/36.606111,-118.062778|36.578581,-120.291994/
Exception Value: 'MyModel' object has no attribute 'model'
路由器和所有其他部件都正常(通过打印测试:))
如有任何提示,我们将不胜感激。
通过 MyModel.objects.get_or_create(start=start, end=end)
收到的 object
不是查询集,因此您会收到此错误。
Django 的 get_or_create()
return 是一个 (object, created)
的元组,其中 object
是检索或创建的对象, created
是一个布尔值,指定是否是一个新对象已创建。
在您的 get_queryset()
方法中,您将查询集 qs
设置为收到的 object
,而实际上它是一个模型对象。
get_queryset()
应该 return 一个 queryset
而不是你正在做的模型对象。
您可以这样做:
def get_queryset(self):
start = self.kwargs['start']
end = self.kwargs['end']
mymodel_obj, created = MyModel.objects.get_or_create(start=start, end=end)
return MyModel.objects.filter(id=mymodel_obj.id) # returns a queryset now