如何使用Django ORM在两个传入模型上查询?
我有以下型号:
class DataStream(models.Model):
category = models.CharField(max_length=255)
description = models.TextField()
class DataStreamSubCategory(models.Model):
data_stream = models.ForeignKey(DataStream)
sub_category = models.CharField(max_length=255)
class DataStreamExample(models.Model):
data_stream = models.ForeignKey(DataStream)
example = models.CharField(max_length=255)
因此,每个DataStream
可以有0个或多个DataStreamSubCategory
对象和0个或多个DataStreamExample
对象。
我想要做的就是将这些值显示在模板中的简单表格中:
----------------------------------------
| Category | Sub-categories | Examples |
----------------------------------------
| Cat1 | Sub-cat1 | Ex1 |
| | Sub-cat2 | Ex2 |
| | Sub-cat3 | |
----------------------------------------
| Cat2 | Sub-cat4 | Ex1 |
| | | Ex2 |
----------------------------------------
那么,查询数据库以获取这些数据的最佳方法是什么? 最明显的(但可能是愚蠢的)方式是这样做的:
data_streams = DataStream.objects.all()
for data_stream in data_streams:
sub_categories = DataStreamSubCategory.objects.filter(data_stream=data_stream)
examples = DataStreamExample.objects.filter(data_stream=data_stream)
但是有没有更高效的方法? 看起来像一些SQL连接应该在这里,但我不知道如何使用Django ORM完成此操作。
您可以直接在模板中查询它,如下所示:
<table>
{% for ds in data_streams %}
<tr>
<td>
{% ds.category %}
</td>
<td>
{% for subcat in ds.datastreamsubsategory_set.all %}
{{subcat.sub_category}}
{% endfor %}
</td>
<td>
{% for example in ds.datastreamexample_set.all %}
{{example.example}}
{% endfor %}
</td>
{% empty %}
<tr><td colspan="3">No categories found</td></tr>
{% endfor %}
</table>
我会让你自己弄清楚格式。
在上下文中,只需发送{'data_streams': data_streams}
基本上,对于反向外键关系,您可以使用object.lowercasemodelname_set.all()
来获取相关的对象查询集。
阅读更多关于跨越关系的查找
或者你可以添加一个related_name
属性,并使用它来代替lowercasemodelname_set
如果您想减少数据库上的查询数量,您甚至可能需要考虑prefetch_related
选项
上一篇: How do I query on two incoming models using the Django ORM?