【问题标题】:Got AttributeError when attempting to get a value for field `members` on serializer `HealthQuotationSerializer`尝试在序列化程序“HealthQuotationSerializer”上获取字段“members”的值时出现 AttributeError
【发布时间】:2021-02-07 07:52:03
【问题描述】:

尝试序列化父子模型。这是我的模型:

class HealthQuotation(models.Model):
  quotation_no = models.CharField(max_length=50)
  insuredpersons = models.IntegerField()
  mobile_no = models.CharField(max_length=10)

  def __str__(self):
      return self.quotation_no

class HealthQuotationMember(models.Model):
   premium = models.FloatField(null=True)
   suminsured = models.FloatField()
   quotation = models.ForeignKey(HealthQuotation,on_delete=models.CASCADE)

   def __str__(self):
     return str(self.quotation)

这是我的序列化程序:

class HealthQuotationMemberSerializer(serializers.ModelSerializer):
  class Meta:
    model = HealthQuotationMember
    fields= "__all__"

class HealthQuotationSerializer(serializers.ModelSerializer):
   members = HealthQuotationMemberSerializer(many=True)

   class Meta:
      model = HealthQuotation
      fields = ['id','members']

在使用父序列化程序序列化父模型时,Django 在尝试获取序列化程序 HealthQuotationSerializer 上字段 members 的值时抛出错误“Got AttributeError”。序列化程序字段可能命名不正确,并且与HealthQuotation 实例。原始异常文本为:“HealthQuotation”对象没有属性”。

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    因为您的模型中没有 members 字段...尝试按以下方式更改您的序列化程序,看看它是否有效:

    class HealthQuotationSerializer(serializers.ModelSerializer):
       quotation = HealthQuotationMemberSerializer()
    
       class Meta:
          model = HealthQuotation
          fields = ['id','quotation']
    

    请注意,我已删除 many=True,因为每个数据 (ForeignKey) 总会有一个对象。当您有多个对象时,例如Many2Many,您应该使用many=True

    【讨论】:

      【解决方案2】:

      您有“HealthQuotation”作为父母和“HealthQuotationMember”作为孩子

      现在,您决定从父级“HealthQuotation”检索数据
      及其相关的孩子将来自“HealthQuotationMember”,对吧?

      要实现这一点,您可以使用 Django SerializerMethodField():

      您的 serializers.py 应如下所示:

      class HealthQuotationMemberSerializer(serializers.ModelSerializer):
          class Meta:
              model = HealthQuotationMember
              fields= '__all__'
      
      class HealthQuotationSerializer(serializers.ModelSerializer):
      
          members = serializers.SerializerMethodField() # I am using SerializerMethodField()
      
          class Meta:
              model = HealthQuotation
              fields = '__all__'
      
          def get_members(self, quotation):
              
              q = HealthQuotationMember.objects.filter(quotation = quotation)
              
              serializer = HealthQuotationMemberSerializer(q, many=True)
              return serializer.data
      
      

      你的意见.py

      class GetHealthQuotationList(ListAPIView):
          
          serializer_class = HealthQuotationSerializer
          queryset = HealthQuotation.objects.all()
      

      你的 url.py 应该是:

      path('get-health-quotation-list', GetHealthQuotationList.as_view()), 
      

      注意:如果您计划从child 表中检索数据并找到其关联的parent,那么您的序列化程序应该可以不用many=True 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 2023-02-03
        • 1970-01-01
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多