类型错误:'type'对象不可迭代 - DRF



我正在制作我的第一个DRF api,当我试图使用get请求访问我的数据时,我遇到了一个奇怪的TypeError,我得到了这个错误:

"类型"对象不可迭代

所有工作,直到我添加了在Movie中获取Reviews.mark平均值的函数。我不明白为什么评论和演员是可迭代的,如果你能向我解释一下,那就太酷了!

下面是一些代码片段。

型号.py

from django.db import models
from django.contrib.auth import get_user_model
import datetime
User = get_user_model()
class Actor(models.Model):
name = models.CharField(max_length=255)
first_name = models.CharField(max_length=255)
class Movie(models.Model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=255, default='Description')
date = models.DateTimeField(default=datetime.date.today)
created_on = models.DateTimeField(auto_now_add = True)
actors = models.ManyToManyField(Actor)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def average_reviews(self):
if hasattr(self, '_average_reviews'):
return self._average_reviews
return self.reviews.aggregate(models.Avg('mark'))

class Reviews(models.Model):
mark = models.IntegerField(default=5)
movie = models.ForeignKey(Movie, on_delete=models.CASCADE)

视图.py

from django.shortcuts import render
from django.db.models import Avg

from rest_framework import viewsets
from rest_framework.authentication import BasicAuthentication
from rest_framework.permissions import IsAuthenticated

from .models import Movie, Actor, Reviews
from .serializers import MovieSerializer, ActorSerializer, ReviewsSerializer

# Create your views here.

class MovieViewSet(viewsets.ModelViewSet):
authentication_classes = (BasicAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = MovieSerializer
def get_queryset(self):
return Movie.objects.all().annotate(_average_reviews=Avg('reviews__mark'))
#queryset = Movie.objects.all()

class ActorViewSet(viewsets.ModelViewSet):
authentication_classes = (BasicAuthentication)
permission_classes = (IsAuthenticated,)
serializer_class = ActorSerializer,
queryset = Actor.objects.all()

class ReviewsViewSet(viewsets.ModelViewSet):
authentication_classes = (BasicAuthentication)
permission_classes = (IsAuthenticated,)
serializer_class = ReviewsSerializer,
queryset = Reviews.objects.all()

序列化程序.py

from rest_framework import serializers
from .models import Movie, Actor, Reviews
class ActorSerializer(serializers.ModelSerializer):
class Meta:
model = Actor
fields = '__all__'
class ReviewsSerializer(serializers.ModelSerializer):
class Meta:
model = Reviews
fields = '__all__'
class MovieSerializer(serializers.ModelSerializer):
actors = ActorSerializer(many=True)
average_reviews = serializers.SerializerMethodField()
def get_average_reviews(self,obj):
return obj.average_reviews()
class Meta:
model = Movie
fields = '__all__'

我也留下追溯更多信息:

Traceback (most recent call last):
File "/home/qcouderc/.local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/qcouderc/.local/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/qcouderc/.local/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/qcouderc/.local/lib/python3.10/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/home/qcouderc/.local/lib/python3.10/site-packages/rest_framework/views.py", line 492, in dispatch
request = self.initialize_request(request, *args, **kwargs)
File "/home/qcouderc/.local/lib/python3.10/site-packages/rest_framework/viewsets.py", line 146, in initialize_request
request = super().initialize_request(request, *args, **kwargs)
File "/home/qcouderc/.local/lib/python3.10/site-packages/rest_framework/views.py", line 394, in initialize_request
authenticators=self.get_authenticators(),
File "/home/qcouderc/.local/lib/python3.10/site-packages/rest_framework/views.py", line 272, in get_authenticators
return [auth() for auth in self.authentication_classes]
TypeError: 'type' object is not iterable
[13/Sep/2022 14:36:00] "GET /api/reviews/ HTTP/1.1" 500 16564

感谢您的帮助

您应该在身份验证类后面添加逗号,以使python理解这是元组:

class ActorViewSet(viewsets.ModelViewSet):
authentication_classes = (BasicAuthentication,)

或者你可以使用列表:

class ActorViewSet(viewsets.ModelViewSet):
authentication_classes = [BasicAuthentication]

最新更新