簡體   English   中英

如何在django模型中選擇相關的所以它不會產生很多子查詢

[英]How to select related in django model so it wont generate a lot of subqueries

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

港口指的是城市,而城市又指的是國家。 然后在 django admin 我想在 list_display Ports 國家顯示:

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在這種情況下會以某種方式幫助我,但是如何在模型中正確使用它?

您可以創建一個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_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)
    objects = PortManager()

    def __str__(self):
        return self.city.__str__()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM