简体   繁体   中英

django rest framework 'QuerySet' object has no attribute '_meta'

I am using django rest framework with generic api view but when I call list api view it gives me AttributeError: 'QuerySet' object has no attribute '_meta' error.

Below id my code

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, )

When the book table is empty it return the empty object but if it has some data the it throws below error.

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'

In your BookSerializer you have

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

You need to specify model class not queryset. It should be

class Meta:
    model = Book

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM