2015-07-12 66 views
0

我有编辑Django REST框架中的查询集的问题。 基本上我需要过滤我的查询并返回单一,所以我的DRF看法是这样的:Django REST框架 - get_queryset:'MyModel'对象没有属性'model'

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 

所以我返回单一模型实例,但是当我试着登入真正的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' 

路由器和所有其他部分为OK(经由打印测试:))

威尔我很感激任何提示。

回答

4

通过MyModel.objects.get_or_create(start=start, end=end)收到的object不是查询集,因此您收到此错误。

Django的get_or_create()回报(object, created)的元组,其中object是所检索到或创建的对象和created是一个布尔值指定一个新的对象是否已创建。

在您的get_queryset()方法中,您将查询集qs设置为此时收到的object实际上是其模型对象。

get_queryset()应该返回一个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 
相关问题