如何在Django模型中选择related,使其不会生成很多子查询

2024-09-28 19:02:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多模型在某种程度上相互参照,例如:

港口是指城市,而城市又指乡村。然后在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在这种情况下会有所帮助,但是如何在模型中正确地使用它呢?在


Tags: django模型selfcitymodeltitlemodelscountry
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

根据Ivan的回答,我为与“一对多”和“多对多”关系相关的多个模型提出了以下结构,并相应地使用select_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__()

相关问题 更多 >