![](/img/trans.png)
[英]Django queryset get all fields in values() plus a foreign key field
[英]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
)。 讓我們假設一個場景,其中B
和A
有很多字段,我感興趣的是所有那些屬於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.