簡體   English   中英

如何使用Django ORM查詢兩個傳入模型?

[英]How do I query on two incoming models using the 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()來獲取相關的對象queryset。

這里閱讀更多關於跨越關系的查詢

或者,您可以添加related_name屬性,並使用它代替lowercasemodelname_set

如果要減少數據庫中的查詢數量,甚至可能要考慮prefetch_related選項

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM