3

试图manytomany在 django 中建立关系,但出现以下错误 -

尝试获取name序列化程序 GenreSerializer 上的字段值时出现 AttributeError。序列化器字段可能命名不正确,并且与 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

序列化程序.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')

网址.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)

视图.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
4

3 回答 3

7

如果您正在使用基于函数的序列化器,并且想要获取 ModelSerializer 的所有信息。然后使用many=True

@api_view()
def movie_list(request):

    movies = Movie.objects.all()
    serializer = MovieSerializer(movies)
    print(serializer)
    return Response(serializer.data)

对于上面的代码,响应是

name尝试获取序列化程序上的字段值时出现 AttributeError MovieSerializer。序列化器字段可能命名不正确,并且与QuerySet 实例上的任何属性或键都不匹配。原始异常文本是:“QuerySet”对象没有属性“名称”。

如果我们只添加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)

那么我们得到的输出是 请用文字替换这个令人讨厌的图像

于 2021-09-24T09:29:50.913 回答
5

与您的其他问题类似,您在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
于 2015-12-23T22:07:09.070 回答
1

让我们举一个简单的示例模型,其中有三个字段

from django.db import models

class Movie(models):
  name = models.CharField()
  description = models.TextField()
  created = models.DateTimeField(auto_now_add=True)

如果您在序列化器字段中使用它,那么您必须传递参数“many = true”以及模型名称,例如

movie = Movie.objects.all()
serializer = MovieSerializer(movie, many=True)

这是因为当您的模型中有多个对象(字段)并且您想要遍历我们使用“many = True”的每个字段时

于 2021-10-22T20:41:54.020 回答