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