DocumentDetail的str的实现方法的工作,但它减慢了一切通过运行一堆额外的查询,当我试图使用它的视图,表单等。有人知道怎么解决这个问题吗?
models.py
class Document(models.Model):
description = models.CharField(max_length=50)
def __str__(self):
return self.description
class DocumentDetail(models.Model):
document = models.ForeignKey(Document, on_delete=models.CASCADE)
detail = models.CharField(max_length=50)
def __str__(self):
return self.document.description
您应该用Document
加载DocumentDetail
。你可以用.select_related(…)
[Django-doc] .
实际上,我们可以加载DocumentDetail
,并将文档本身与DocumentDetail
一起加载:
DocumentDetail.objects.select_related('document').get(pk=1)
这将创建一个LEFT OUTER JOIN
,从而在同一个查询中同时加载DocumentDetail
和Document
。
我们也可以获取所有DocumentDetail
s和相关的Document
s:
DocumentDetail.objects.select_related('document')# all DocumentDetails
在视图/模型视图集等中,您需要在DocumentDetail
上调用str(…)
,因此您应该重写查询以在相同的查询中加载相关的Document
。