Python 如何在django模型中选择related,这样它就不会生成很多子查询
我有很多模型以某种方式相互引用,例如: 港口是指城市,而城市又是指国家。然后在django admin中,我想在列表中显示以下国家/地区的显示端口:Python 如何在django模型中选择related,这样它就不会生成很多子查询,python,sql,django,django-orm,Python,Sql,Django,Django Orm,我有很多模型以某种方式相互引用,例如: 港口是指城市,而城市又是指国家。然后在django admin中,我想在列表中显示以下国家/地区的显示端口: class Country(models.Model): title = models.CharField() class City(models.Model): title = models.CharField() country = models.ForeignKey(Country) class Port(m
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\u related
会对我有所帮助,但是如何在模型中正确使用它?您可以创建一个PortManager
类,覆盖get\u 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\u 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__()