Epimark Chami
Epimark Chami

Reputation: 33

How to get data related from another table django rest framework

I have three model Pesticide, Disease and Instruction what i want is to get all disease with relation to pesticide which relate to instruction model

class Disease(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name

class Pesticide(models.Model):
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name


class Treatment(models.Model):
    disease = models.ForeignKey(Disease, related_name='treatments', on_delete=models.DO_NOTHING)
    pesticide = models.ForeignKey(Pesticide, related_name='treatments', on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.instruction

and serializer

class PesticideSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Pesticide
        fields = ('id', 'name')

class DiseaseSerializer(serializers.ModelSerializer):
    pesticides = PesticideSerializer(source='treatment_set', read_only=True)
    class Meta:
        model = Disease
        fields = [

            'id',
            'name',
            'pesticides',
           
        ]

My problem is that i can not get pesticides in django serializer

Upvotes: 1

Views: 1346

Answers (2)

Roham
Roham

Reputation: 2110

I think changing the line pesticides = PesticideSerializer(source='treatment_set', read_only=True) in DiseaseSerializer to pesticides = PesticideSerializer(source='treatment_set', read_only=True, many=True) will solve your problem (you should add many=True because the relation type is one to many).

Upvotes: 0

JPG
JPG

Reputation: 88499

Use serializers.SerializerMethodField as

class DiseaseSerializer(serializers.ModelSerializer):
    pesticides = serializers.SerializerMethodField()

    def get_pesticides(self, disease):
        pesticide_qs = Pesticide.objects.filter(treatments__disease=disease)
        return PesticideSerializer(pesticide_qs, many=True).data

    class Meta:
        model = Disease
        fields = ['id', 'name', 'pesticides']

Upvotes: 1

Related Questions