【问题标题】:AttributeError when attempting to get a value for field on serializer尝试获取序列化程序上的字段值时出现 AttributeError
【发布时间】:2021-10-24 21:56:25
【问题描述】:

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

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

这里有一个类似的答案推荐设置many=True,但它不起作用 - Attribute error when attempting to get a value for field

models.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')

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)

views.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

【问题讨论】:

  • 您是否将模型包含在 serializer.py 中? IE。 from app.models import Movie, Genre
  • 是的,我已经完成了导入。
  • 你能用你如何称呼他们来更新你的问题吗?还是编译时出现此错误?谢谢。
  • @arcee123 完成。它符合这些错误。只有当我尝试访问 /genres/pk 时才会收到错误
  • 试试 CptLemming 所说的……如果不尝试放弃你的“related_name”属性。可能会扼杀你的逆向关系。

标签: python django django-rest-framework django-serializer


【解决方案1】:

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

@api_view()
def movie_list(request):

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

对于上面的代码,响应是

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

如果我们只在 serializer = MovieSerializer(movies, many=True) 中添加many=True

@api_view()
def movie_list(request):

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

那么我们得到的输出是

【讨论】:

【解决方案2】:

与您的其他问题类似,您在 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

【讨论】:

    【解决方案3】:

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

    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”的每个字段时

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2022-11-29
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多