根据我的代码库:
class City(models.Model):
name = models.CharField(max_length=100)
...
class District(models.Model):
city = models.ForeignKey(City, on_delete=models.CASCADE)
class Park(models.Model):
district = models.ForeignKey(District, on_delete=models.CASCADE, related_name="parks")
class Plant(models.Model):
name = models.CharField(max_length=200)
plant_type = models.CharField(max_length=200)
park = models.ForeignKey(Park, on_delete=models.CASCADE, related_name="plants")
def plants_of_type_in_park(plant_type, park):
return park.plants.filter(plant_type=plant_type)
def generate_garden_report():
report_data = {}
plant_types = ["rose", "tulip", "daisy", ...etc]
districts = District.objects.all()
districts = districts.prefetch_related("parks", "parks__plants")
for dist in districts.all():
for park in districts.parks.all():
for plant in plant_types:
report_data[dist.city.name][plant] += plants_of_type_in_park(plant, park).count()
return report_data
我的目标是使用预取来优化generate_garden_report
函数.我加了districts.prefetch_related("parks", "parks__plants")
.但是,由于plants_of_type_in_park
使用筛选器,因此它会触发另一个查询.我的方法是预取每个过滤器:
districts = districts.prefetch_related("parks", "parks__plants")
for plant in plant_types:
districts = districts.prefetch_related(Prefetch("parks_plants", queryset=Plant.objects.filter(plant_type=plant)))
但是,由于parks_plants
只能分配一次,所以我不能为此创建多个筛选器.我的目标是在对plants_of_type_in_park
函数影响最小的情况下预取所需的一切,因为它在代码库的其他地方使用.