从 django rest 中具有反向关系的模型中检索数据

Retrieve data from models having reverse relationship in django rest

我有 3 个模型,其中模型 A 具有另一个反向顺序的外键,例如:-

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) 

我正在尝试根据图书 ID 获取所有章节和小节。在我使用嵌套序列化程序但嵌套序列化程序减慢其响应之前。 我正在尝试通过 select_related 实现它,任何人都可以帮助我进行视图查询和序列化程序 class。我想要这样的回复:

数据=[ “部分”:“A”, “标题”:“介绍”, “小节”:[ { “编号”:1, "sub_title": "标题" } ] ]

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

嵌套序列化程序本身 不会 减慢响应速度,这只是因为它会导致 N+1 问题:你需要加载bulk.

中的相关数据

您可以为此使用 .prefetch_related(…) [Django-doc],因此:

Section.objects<strong>.prefetch_related(</strong>'sections'<strong>)</strong>

这将在 批量 中加载所选 Section 中的 SubSection 秒。

然而,对 related_name=… parameter [Django-doc] 使用 'sections' 没有多大意义,因为这是反向关系的名称。因此,您可能希望将其重命名为:

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

因此预取:

Section.objects<strong>.prefetch_related(</strong>'subsections'<strong>)</strong>