从 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>
我有 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>