如何在django模型中选择相关的,这样就不会产生很多子查询

时间:2016-12-08 09:20:26

标签: python sql django django-orm

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

港口指的是城市,而城市则指国家。然后在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会在这种情况下以某种方式帮助我,但是如何在模型中正确使用它?

2 个答案:

答案 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_relatedprefetch_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__()