首页 > 解决方案 > 尝试在序列化程序“HealthQuotationSerializer”上获取字段“members”的值时出现 AttributeError

问题描述

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

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 在尝试获取members序列化程序上的字段值时抛出错误“Got AttributeError” HealthQuotationSerializer。序列化程序字段可能命名不正确,并且与HealthQuotation实例上的任何属性或键都不匹配。原始异常文本为:'HealthQuotation ' 对象没有属性”。

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


您有“ 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参数。


推荐阅读