![](/img/trans.png)
[英]django model select_related or prefetch_related child model
[英]How to select related in django model so it wont generate a lot of subqueries
我有很多模型以某種方式相互引用,例如:
港口指的是城市,而城市又指的是國家。 然后在 django admin 我想在 list_display Ports 國家顯示:
class Country(models.Model):
title = models.CharField()
class City(models.Model):
title = models.CharField()
country = models.ForeignKey(Country)
class Port(models.Model):
city = models.ForeignKey(City)
def __str__(self):
return self.city.county.title
所以基本上每個端口 django 都會生成更多的查詢。 我認為select_related
在這種情況下會以某種方式幫助我,但是如何在模型中正確使用它?
您可以創建一個PortManager
類並覆蓋get_queryset
方法並在模型中引用它:
class PortManager(models.Manager):
def get_queryset(self):
return super(PortManager, self).get_queryset().select_related()
class Port(models.Model):
city = models.ForeignKey(City)
objects = PortManager()
def __str__(self):
return self.city.country.title
根據 Ivan 的回答,我相應地使用select_related
和prefetch_related
為與“一對多”和“多對多”關系相關的多個模型提出了以下結構。
在提供的示例中,只需要select_related
。
class Country(models.Model):
title = models.CharField()
def __str__(self):
return '{0}'.format(self.title)
class CityManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('country')
class City(models.Model):
title = models.CharField()
country = models.ForeignKey(Country)
objects = CityManager()
def __str__(self):
return '{0}-{1}'.format(
self.title,
self.country.__str__(),
)
class PortManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('city')
class Port(models.Model):
city = models.ForeignKey(City)
objects = PortManager()
def __str__(self):
return self.city.__str__()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.