Django:在一个查询中连接两个表



在我的模板中,我有一个表,我想用来自两个使用外键的不同表的数据填充它。

我在谷歌搜索时找到的解决方案是使用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')
)

但是,如果从Table1Table2有一个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问题

相关内容

  • 没有找到相关文章

最新更新