【发布时间】:2020-05-09 23:18:30
【问题描述】:
我很难理解 Django ORM 中的 prefetch_related 和 select_related。我有以下型号:
class City(models.Model):
name = models.CharField(max_length=35)
state = models.ForeignKey('states.State', on_delete=models.CASCADE)
class Street(models.Model):
name = models.CharField(max_length=35)
building = models.ForeignKey('buildings.Building', on_delete=models.CASCADE)
city = models.ForeignKey('cities.City', on_delete=models.CASCADE)
现在我的 views.py:
cities = City.objects.all()
streets = Street.objects.all()
for city in cities:
has_bank = streets.filter(building_id=1, city=city)
if has_bank:
city.has_bank = 1
has_cinema = streets.filter(building_id=2, city=city)
if has_cinema:
city.has_cinema = 1
has_church = streets.filter(building_id=3, city=city)
if has_church:
city.has_church = 1
但现在每次 for 循环迭代时它都会访问数据库 3 次。我正在尝试提高时间复杂度 - 现在是 3N + 2 其中 N 是城市数量,但我无法理解 select_related 和 prefetch_related。
你能给我一个例子,我将如何改进它,使其不会在 for 循环中访问数据库 3 次?
【问题讨论】:
-
我知道有什么区别,但我无法让它与
streets.filter()一起工作我认为它会“查询”QuerySet 但它不会。 -
它会为你预取关系数据。
-
@AshrafulIslam 但是我如何将它应用于
.filter()。我真的很感激一个简单的例子。 -
例如
streets = Street.objects.all().select_related('building')
标签: python django orm django-views