Python 如何使用Django ORM查询两个传入模型?
我有以下型号:Python 如何使用Django ORM查询两个传入模型?,python,django,django-models,django-templates,django-queryset,Python,Django,Django Models,Django Templates,Django Queryset,我有以下型号: 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.CharFie
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
对象
我想做的基本上是在模板中的一个简单表中显示这些值:
----------------------------------------
|类别|子类别|示例|
----------------------------------------
|Cat1 |子Cat1 | Ex1|
||子类2 | Ex2|
||分三类||
----------------------------------------
|第2类|子第4类| 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>
{数据流%中的ds的百分比}
{%ds.category%}
{ds.DataStreamSubcategory_set.all%}
{{subcat.sub_category}
{%endfor%}
{例如在ds.datastreamexample_set.all%}
{{example.example}}
{%endfor%}
{%empty%}
找不到类别
{%endfor%}
我会让你自己弄清楚格式的
在上下文中,只需发送{'data\u streams':data\u streams}
基本上,对于反向外键关系,您可以执行object.lowercasemodelname\u set.all()
来获取相关的对象查询集
阅读更多关于
或者您可以添加一个相关的\u名称
属性,并使用该属性代替小写的emodelname\u集
你可能想考虑是否要减少数据库上的查询数量:我知道必须有一个简单的机制来处理这个问题,所以你的例子不太管用,但很接近。您需要将
\u set
添加到模板中模型名称的末尾。因此,ds.datastreamsubcategory\u set.all
。谢谢@杰夫:你说得对。我正在考虑指定一个相关的名称,但没有注意到这一点。谢谢我用简单的外键关系编辑了这个案例的答案,我建议select\u related
,而不是prefetch\u related
。