2016-03-15 120 views
1

我使用django rest框架與通用api視圖,但是當我打電話列表api視圖它給了我AttributeError:'QuerySet'對象沒有屬性'_meta'錯誤。Django rest框架'QuerySet'對象沒有屬性'_meta'

下面ID我的代碼

models.py

class Book(models.Model): 
    name = models.CharField(max_length=200, null=False, blank=False) 
    cover = models.ImageField(upload_to=RenameFile('books', 'cover'), null=False, blank=False) 
    author = models.ForeignKey(Author, null=False, blank=False) 
    rating = models.DecimalField(decimal_places=1, max_digits=1, null=True, blank=True) 
    blurb = models.TextField(null=False, blank=False) 
    free_chapters = models.FileField(upload_to=RenameFile('books', 'free'), null=False, blank=False) 
    free_chapters_no = models.CharField(max_length=5, null=False, blank=False) 
    paid_chapters = models.FileField(upload_to=RenameFile('books', 'paid'), null=False, blank=False) 
    paid_chapters_no = models.CharField(max_length=5, null=False, blank=False) 
    paid_chapters_credit = models.CharField(max_length=255, null=False, blank=False) 
    language = models.ForeignKey(Language, null=False, blank=False) 
    genre = models.ManyToManyField(Genre) 

    def __str__(self): 
     return self.name 

@deconstructible 
class RenameFile(object): 

    def __init__(self, path, filetype): 
     self.path = path 
     self.filetype = filetype 

    def __call__(self, instance, filename): 
     ext = filename.split('.')[-1] 

     filename = '{}.{}'.format(self.filetype, ext) 

     filepath = self.path + '/' + instance.name 

     if os.path.exists(os.path.join(settings.MEDIA_ROOT, filepath, filename)): 
      os.remove(os.path.join(settings.MEDIA_ROOT, filepath, filename)) 
     return os.path.join(filepath, filename) 

serializers.py

class BookSerializer(serializers.ModelSerializer): 

    author = AuthorSerializer(
     required = True 
    ) 

    genre = GenreSerializer(
     many=True 
    ) 

    language = LanguageSerializer(
     required=True 
    ) 

    class Meta: 
     model = Book.objects.all() 
     fields = ('id', 'name', 'author', 'cover', 'rating', 'blurb', 'free_chapters', 'free_chapters_no', 
        'paid_chapters', 'paid_chapters_no', 'paid_chapters_credit', 'language', 'genre') 

views.py

class BookList(generics.ListCreateAPIView): 

    queryset = Book.objects.all() 
    serializer_class = BookSerializer 

    permission_classes = (permissions.IsAdminUser,) 

當書籍表爲空時,它將返回空對象,但是如果它有一些數據,則會拋出錯誤。

File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response 
response = self.process_exception_by_middleware(e, request) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response 
response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view 
return view_func(*args, **kwargs) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/django/views/generic/base.py", line 68, in view 
return self.dispatch(request, *args, **kwargs) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/views.py", line 466, in dispatch 
response = self.handle_exception(exc) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/views.py", line 463, in dispatch 
response = handler(request, *args, **kwargs) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/generics.py", line 286, in get 
return self.retrieve(request, *args, **kwargs) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/mixins.py", line 58, in retrieve 
return Response(serializer.data) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 503, in data 
ret = super(Serializer, self).data 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 239, in data 
self._data = self.to_representation(self.instance) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 459, in to_representation 
fields = self._readable_fields 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/django/utils/functional.py", line 33, in __get__ 
res = instance.__dict__[self.name] = self.func(instance) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 353, in _readable_fields 
field for field in self.fields.values() 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 339, in fields 
for key, value in self.get_fields().items(): 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/serializers.py", line 918, in get_fields 
info = model_meta.get_field_info(model) 
File "/home/harish/Projects/quickreads/venv/lib/python3.4/site-packages/rest_framework/utils/model_meta.py", line 68, in get_field_info 
opts = model._meta.concrete_model._meta 
AttributeError: 'QuerySet' object has no attribute '_meta' 

回答

10

在你BookSerializer你有

class Meta: 
    model = Book.objects.all() 

你需要指定模型類不查詢集。它應該是

class Meta: 
    model = Book 
+0

非常感謝。有效。 –

相關問題