Python 如何在django模型中选择related,这样它就不会生成很多子查询

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

我有很多模型以某种方式相互引用,例如:

港口是指城市,而城市又是指国家。然后在django admin中,我想在列表中显示以下国家/地区的显示端口:

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__()