我有很多模型以某种方式相互引用,例如:
港口指的是城市,而城市则指国家。然后在django admin中我想在list_display Ports country:
中显示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会在这种情况下以某种方式帮助我,但是如何在模型中正确使用它?
答案 0 :(得分:2)
您可以创建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
答案 1 :(得分:0)
根据Ivan的回答,我提出了以下结构,用于与"一对多"相关的多个模型。和#34;多对多"相应地使用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)
def __str__(self):
return self.city.__str__()