简体   繁体   中英

Retrieve data from models having reverse relationship in django rest

I have 3 models where model A has foreign key of another in reverse order like:

class Book(models.Model):
name = models.CharField(max_length=100)
img=models.CharField(blank=True)
category=models.CharField(max_length=100,null=True)

class Section(models.Model):
book= models.ForeignKey(Book, related_name='sections', on_delete=models.PROTECT)
title= models.TextField(null=True)

class SubSection(models.Model):
section=models.ForeignKey(Section, related_name='subSections', 
                           on_delete=models.PROTECT, null=True) 
sub_title= models.TextField(null=True) 

I am trying to fetch all sections and subsections on the basis of book id. Before I was using nested serializer but nested serializer slow down its response. i am trying to achieve it with select_related can anyone help me with view query and serializer class. I want response like:

data=[
  "section": "A",
  "title": "intro",
  "subsection": [
    {
      "id": 1,
      "sub_title": "title"
    }
  ]
]

Before I was using nested serializer but nested serializer slow down its response.

The nested serializer itself does not slow down the response, this simply because it will result in an N+1 problem: you need to load the related data in bulk .

You can use .prefetch_related(…) [Django-doc] for this, so:

Section.objects.prefetch_related('sections')

This will load SubSection s of the selected Section (s) in bulk .

It however does not make much sense to use 'sections' for the related_name=… parameter [Django-doc] , since this is the name of the relation in reverse. You thus might want to rename this to:

class SubSection(models.Model):
    section = models.ForeignKey(
        Section,
        related_name='subsections',
        on_delete=models.PROTECT
    )
    sub_title= models.TextField()

and thus prefetch with:

Section.objects.prefetch_related('subsections')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM