python - django rest framework 'QuerySet' 对象没有属性 '_meta'

标签 python django rest django-rest-framework

我正在使用带有通用 api View 的 django rest 框架,但是当我调用列表 api View 时,它给我 AttributeError: 'QuerySet' object has no attribute '_meta' 错误。

下面是我的代码

模型.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)

序列化器.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, )

当 book 表为空时,它返回空对象,但如果它有一些数据,它会抛出以下错误。

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'

最佳答案

在您的 BookSerializer

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

您需要指定模型类而不是查询集。应该是

class Meta:
    model = Book

关于python - django rest framework 'QuerySet' 对象没有属性 '_meta',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36006367/

相关文章:

django - include() 和 flatpages 混淆

python - 从 Django 中的 URL 获取变量中的两个字符串

python - 如何创建一个循环来读取 python 脚本中的多个图像?

python - 浏览器模拟 - Python 3

python - 删除列表中有条件的元素

php - IIS7/PHP/Laravel 上的 PUT 和 DELETE

java - Jersey Client 能否自动将 POJO 实体编码为 application/x-www-form-urlencoded,还是我需要编写自定义 MessageBodyWriter?

python - 如何从链接中提取经度和纬度

Django 数据库表删除

java - 无法在Jersey中进行基本的HTTP身份验证