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