我有一个定义如下的待办事项模型:
class Action(models.Model):
name = models.CharField("Action Name", max_length=200, unique = True)
complete = models.BooleanField(default=False, verbose_name="Complete?")
reoccurance = models.ForeignKey(Reoccurance, blank=True, null=True, verbose_name="Reoccurance")
notes = models.TextField("Notes", blank=True)
tags = TaggableManager()
class Reoccurance(models.Model):
label = models.CharField("Label", max_length=50, unique = True)
days = models.IntegerField("Days")
我想列出所有不完整的操作:
actions = Action.objects.filter(complete=False)
我的动作列表模板循环:
{% for action in actions %}
<p>{{ action }}</p>
{% if action.reoccurance %}
<p>{{ action.reoccurance }}</p>
{% endif %}
{% for tag in action.tags.all %}
<span>{{ tag }}</span>{% if not forloop.last %}, {% endif %}
{% endfor %}
{% endfor %}
使用django-debug-toolbar,我看到对于每个操作,我都会在 {% if action.reoccurance %} 和 {% for tag in action.tags.all %} 上访问数据库。
有没有更好的方法来编写我的查询,以便不会在循环的每次迭代中对数据库进行 ping 操作?我认为它与 select_related 有关,但我不确定如何处理django-taggit。
更新我得到了部分答案。select_related 确实有效,但我必须指定重复出现,可能是因为我不能将它用于标签:
actions = Action.objects.select_related('reoccurance').filter(complete=False)
问题仍然存在,我为模板循环中的每个“action.tags.all”都打了数据库。是否可以在 django-taggit 上使用某种预取?