如何使用Django ORM查询两个传入模型?

2024-10-04 07:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

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来完成这一点。你知道吗


Tags: datastreammodelobjectsmodelslengthmaxclass
1条回答
网友
1楼 · 发布于 2024-10-04 07:31:02

您可以直接在模板中进行查询,如下所示:

<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()来获取相关的对象queryset。你知道吗

阅读更多关于lookups that span relationships here

或者您可以添加一个related_name属性并使用它来代替lowercasemodelname_set

如果您想减少数据库上的查询数量,甚至可以考虑使用^{} option

相关问题 更多 >