Search code examples
djangodjango-rest-frameworkdjango-serializerdjango-rest-viewsets

How to get the data including the relation table's entry with a GET request in DRF


I'm trying my hand at DRF recently and I've got this issue below to be solved for my project.

I've two Models

class JobsMaster(models.Model):
    job_id = models.CharField(max_length=128, unique=True)
    job_name = models.CharField(max_length=128)
    scheduled_time = models.CharField(max_length=128)
    args = models.TextField()
    interval = models.CharField(max_length=50)
    repeat = models.CharField(max_length=100)

class JobProcessDetails(models.Model):
    job_id = models.ForeignKey('JobsMaster')
    sequence = models.IntegerField()
    step_name = models.CharField(max_length=128)
    records = models.IntegerField(null=True,blank=True)
    created_by = models.CharField(max_length=155,default='system')
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        unique_together = (('job_id', 'sequence'),)

Corresponding Serializers

class JobsMasterSerializer(serializers.ModelSerializer):

    class Meta:
        model = JobsMaster
        fields = '__all__'

class JobProcessDetailsSerializer(serializers.ModelSerializer):

    class Meta:
        model = JobProcessDetails
        fields = '__all__'

their Viewsets

class JobsMasterViewSet(viewsets.ModelViewSet):

    queryset = JobsMaster.objects.all()
    serializer_class = JobsMasterSerializer
    filter_fields = ('job_id',)

class JobProcessDetailsViewSet(viewsets.ModelViewSet):
    queryset = JobProcessDetails.objects.all()
    serializer_class = JobProcessDetailsSerializer
    filter_fields = ('job_id','sequence',)

I do not know if this is the right way to build viewsets and serializer but it worked for me.

I want to write a GET request from UI to fetch the data from JobProcessDetails which includes the data from the related JobsMaster table as well.

for example, the response data should be containing the below fields

    job_id : xxxxx
    sequence : xxxx
    step_name : 'xxxx'
    records : xxxx
    created_by : 'xxxxx'
    created_on : dd/mm/yyyy
    job_id__job_name : 'xxxxx'
    job_id__scheduled_time : 'xxxxx'
    job_id__args : 'xxxxx'
    job_id__interval : 'xxxxx'
    job_id__repeat : 'xxxxx'

Is there any way that I can tweak something to get this with a single GET request.


Solution

  • try like this

    class JobProcessDetailsSerializer(serializers.ModelSerializer):
      job_id = JobsMasterSerializer(read_only=True)
    
      class Meta:
        model = JobProcessDetails
        fields = [
          'job_id '
          'sequence'
          'step_name'
          'records'
          'created_by' 
          'created_on'
        ]