Как представить все множество полей в классе сериализатора djangorestgramework?

#django #django-rest-framework

#джанго #django-rest-фреймворк

Вопрос:

Я хочу отобразить множество полей со значениями там, используя django.

Базовая модель

 class SalesAction(models.Model):  sales_representative = models.ForeignKey(  SalesRepresentative, on_delete=models.CASCADE)  doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE)  remark = models.CharField(max_length=500)  date = models.DateField()  medicines = models.ManyToManyField(Medicine, through='SalesActionMedicine')   def __str__(self):  return f'{self.sales_representative} - {self.doctor}'  

Подробная модель

 class SalesActionMedicine(models.Model):  sales_action = models.ForeignKey(SalesAction, on_delete=models.CASCADE)  medicine = models.ForeignKey(Medicine, on_delete=models.CASCADE)  quantity_type = models.CharField(max_length=50)  quantity = models.PositiveIntegerField()   

Я хочу представить все лекарства, связанные с каждым объектом в SalesAction классе модели.

Это сериализатор, который я построил.

 class SalesActionMedicineSerializer(serializers.ModelSerializer):  class Meta:  model = SalesActionMedicine  fields = ('sales_action', 'medicine', 'quantity_type', 'quantity')   
 class SalesActionSerializer(serializers.ModelSerializer):  medicines = SalesActionMedicineSerializer(many=True)   class Meta:  model = SalesAction  fields = ('sales_representative', 'doctor', 'remark', 'date', 'medicines')   

Этот код выдает мне эту ошибку:

Got AttributeError when attempting to get a value for field sales_action on serializer salesactionмедицинасериализатор . The serializer field might be named incorrectly and not match any attribute or key on the Медицина instance. Original exception text was: 'Medicine' object has no attribute 'sales_action'.

Ответ №1:

Вам нужно использовать MedicineSerializer , чтобы получить лекарства вместо SalesActionMedicineSerializer этого . Вы также можете получить данные о продажах лекарств с обратной связью.

Итак, код будет

 class SalesActionSerializer(serializers.ModelSerializer):  medicines = MedicineSerializer(many=True)  sales_medicines = SalesActionMedicineSerializer(source='salesactionmedicine_set', many=True)   class Meta:  model = SalesAction  fields = ('sales_representative', 'doctor', 'remark', 'date',   'medicines', 'sales_medicines')  

Комментарии:

1. Но мне нужно получить поля в through атрибуте.

2. Я обновил ответ на ваш запрос