簡體   English   中英

從Django QuerySet獲取所有值以及相關模型中的其他字段

[英]Get all values from Django QuerySet plus additional fields from a related model

我想知道是否有從Django模型獲取所有字段的快捷方式,並且只定義通過連接(或多個連接)檢索的其他字段。

考慮以下模型:

class A(models.Model):
    text = models.CharField(max_length=10, blank=True)

class B(models.Model):
    a = models.ForeignKey(A, null=True, on_delete=models.CASCADE)
    y = models.PositiveIntegerField(null=True)

現在我可以像這樣使用values()函數

B.objects.values('y', 'a__text')

獲取包含B模型中指定值和A模型中實際字段的元組。 如果我只使用

B.objects.values()

我只得到包含B模型中字段的元組(即y和外鍵id a )。 讓我們假設一個場景,其中BA有很多字段,我感興趣的是所有那些屬於B但只在A.的單個字段中A.手動指定values()中的所有字段名稱,這是可能的,但是單調乏味並且容易出錯。

那么有沒有辦法指定我想要所有本地字段,但只有(少數)特定的連接字段?

注意:我目前正在使用Django 1.11,但如果解決方案僅適用於更新版本,我也對此感興趣。

您可以使用prefetch_related 查看文檔

您希望使用延遲字段等性能優化技術:

queryset = Pizza.objects.only('name')

restaurants = Restaurant.objects.prefetch_related(預取('best_pizza',queryset = queryset))

在你的情況下,你可以做這樣的事情:

from django.db.models import Prefetch

queryset = A.objects.only('text')
b_list = B.objects.prefetch_related(Prefetch('a', queryset=queryset))

也許這樣的東西會適用於你的情況?

B.objects.select_related('a').defer('a__field_to_lazy_load');

這將加載兩個模型中的所有字段,除了您在defer()中指定的字段,您可以使用通常的Django雙下划線約定來遍歷關系。

您在defer()中指定的字段將不會從數據庫加載,但如果您稍后嘗試訪問它們(例如在模板中),它們將是。

暫無
暫無

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

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