我简直被难住了。我正在尝试prefect_related
在我的 django 应用程序中实现一个教科书案例,但它根本行不通。以下是相关型号:
class CanUseUnit(models.Model):
objects = UnitManager()
ingredient = models.ForeignKey('Ingredient', db_column='ingredient', related_name='useable_units')
unit = models.ForeignKey('Unit', related_name='used_by', db_column='unit', limit_choices_to=models.Q(parent_unit__exact=None))
请注意,虽然这个模型有一个自定义的 Manager,但这是一个简单的子类,models.Managar
只有 1 个方法 named get_all_info()
,所以我认为这与我的问题没有任何关系:
我正在尝试查询所有成分,并预取它们的可用单位。这是我的 Django 查询:
def list_ingredients(request):
ingredients = Ingredient.objects.all().order_by('accepted', 'name').prefetch_related('useable_units')
for ingredient in ingredients:
print(ingredient.useable_units.all())
return render(request, 'admin/list_ingredients.html', {'ingredients': ingredients})
但是 Django 似乎在每条print
语句上都命中了数据库……这是怎么回事?
编辑:
从模板调用时,缓存似乎确实有效。当我在上面的视图中省略打印语句时,访问包含以下模板代码的页面:
{% for ingredient in ingredients %}
<tr>
<td><a href="/ingredients/edit/{{ ingredient.id }}/">{{ ingredient.name }}</a></td>
<td align="center">{{ ingredient.useable_units.count }}</td>
</tr>
{% endfor %}
数据库只被击中两次(我预计,一次用于成分,一次用于 prefetch_related)。
已解决:好吧,问题似乎已经解决了……我一直在尝试并重新启动测试服务器,但突然它停止查询每种成分。不知道发生了什么,但我很高兴它解决了。