在我的模板中,我有一个表,我想用来自两个使用外键的不同表的数据填充它。
我在谷歌搜索时找到的解决方案是使用values((,下面是我的查询集示例:
data = Table1.objects.all().filter(date=today).values('table2__price')
我的模板
{% for item in data %}
<tr class="original">
<td>{{ item.fruit }}</td>
<td>{{ item.table2__price }}</td>
</tr>
{% endfor %}
它确实从表2中获取了价格,但它也使表1中的数据(item.fruit(消失。如果我删除了values字段,Table1就会相应地填充。
有人对我做错了什么有任何反馈吗?
感谢
如果使用.values(…)
[Django-doc],则检索一个字典的查询集,该查询集只包含指定的值。这不是一个好主意。这不仅是因为正如你所发现的,它将不再使用模型中的值,而且你会">侵蚀";模型层:它不再是Table1
对象,而是一个字典。这是原始痴迷的一种形式反模式[reformation.guru].
您可以使用.annotate(…)
[Django-doc]为这个查询集产生的元素添加额外的属性:
from django.db.models import F
data = Table1.objects.filter(date=today).annotate(
table2__price=F('table2__price')
)
但是,如果从Table1
到Table2
有一个ForeignKey
(或OneToOneField
(,您可以使用.select_related(…)
[Django-doc]:在同一查询中选择Table2
的列
data = Table1.objects.filter(date=today).select_related('table2')
在模板中,您可以使用:
{{ item.fruit }}
{{ item.table2.price}}
{{ item.table2.other_attr}}
.select_related(…)
部分不是严格必要的,但如果没有它,它将对每个项进行额外的查询,因此这将产生N+1问题。