qwe*_*rtp 5 python django django-serializer django-rest-framework
尝试在 django 中建立manytomany关系,但出现以下错误 -
尝试获取序列化器 GenreSerializer 上的字段值时出现 AttributeError
name。序列化程序字段可能命名不正确,并且与 Movie 实例上的任何属性或键不匹配。原始异常文本是:“电影”对象没有属性“名称”。
这里有一个类似的答案推荐设置many=True,但它不起作用 -
尝试获取字段值时出现属性错误
模型.py
class Genre(models.Model):
name = models.CharField(max_length=255,unique=True)
def __unicode__(self):
return self.name
class Movie(models.Model):
mname = models.CharField(max_length=255)
genres = models.ManyToManyField(Genre,related_name='movies')
def __unicode__(self):
return self.mname
Run Code Online (Sandbox Code Playgroud)
序列化器.py
class GenreSerializer(serializers.ModelSerializer):
class Meta:
model = Genre
fields = ('name','id')
class MovieSerializer(serializers.ModelSerializer):
genres = GenreSerializer(many=True, read_only=True)
class Meta:
model = Movie
fields = ('id','genres','mname')
Run Code Online (Sandbox Code Playgroud)
urls.py
urlpatterns = [
url(r'^genres/$', views.GenreList.as_view()),
url(r'^genres/(?P<pk>[0-9]+)$', views.GenreDetail.as_view()),
]
urlpatterns = format_suffix_patterns(urlpatterns)
Run Code Online (Sandbox Code Playgroud)
视图.py
class GenreList(generics.ListCreateAPIView):
queryset = Genre.objects.all()
serializer_class = GenreSerializer
class GenreDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = GenreSerializer
def get_queryset(self):
genres = Genre.objects.get(pk=self.kwargs.get('pk', None))
movies = Movie.objects.filter(genres=genres)
return movies
Run Code Online (Sandbox Code Playgroud)
小智 15
如果您使用的是基于函数的序列化器,并且想要获取 ModelSerializer 的所有信息。然后使用many=True
@api_view()
def movie_list(request):
movies = Movie.objects.all()
serializer = MovieSerializer(movies)
print(serializer)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,响应是
name尝试获取序列化器上字段的值时出现 AttributeErrorMovieSerializer。序列化程序字段可能命名不正确,并且与QuerySet实例上的任何属性或键不匹配。原始异常文本是:“QuerySet”对象没有属性“name”。
如果我们只添加many=Trueserializer = MovieSerializer(movies, Many=True)`:
@api_view()
def movie_list(request):
movies = Movie.objects.all()
serializer = MovieSerializer(movies, many=True)
print(serializer)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)
那么我们得到的输出是

与您的其他问题类似,您在GenreDetail视图中使用了不正确的序列化器。您需要为您返回的模型类型添加序列化器get_queryset:
class GenreDetail(generics.RetrieveUpdateDestroyAPIView):
serializer_class = MovieSerializer
def get_queryset(self):
genres = Genre.objects.get(pk=self.kwargs.get('pk', None))
movies = Movie.objects.filter(genres=genres)
return movies
Run Code Online (Sandbox Code Playgroud)