Получил ошибку атрибута при попытке получить значение для поля `members` в сериализаторе ‘HealthQuotationSerializer`

#django #django-models #django-rest-framework #django-views #django-serializer

#django #django-модели #django-rest-framework #django-просмотры #django-сериализатор

Вопрос:

Пробуем сериализовать родительскую и дочернюю модели.Вот мои модели:

 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 в сериализаторе HealthQuotationSerializer . Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу в HealthQuotation экземпляре. Исходный текст исключения был: объект ‘HealthQuotation’ не имеет атрибута «.

Ответ №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

 

Ваш views.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 аргументов.