Skip to main content
 首页 » 编程设计

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

2025年05月04日23emanlee

我正在使用带有通用 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