我想知道是否存在从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.
中的单个字段感兴趣values()
调用中的字段名称是可能的,但乏味且容易出错。
那么有没有一种方法可以指定我想要所有本地字段,但只需要(几个)特定的联接字段?
注意:我当前正在使用Django 1.11,但是如果解决方案仅适用于更新的版本,我也会对此感兴趣。
答案 0 :(得分:0)
您可以为此使用prefetch_related
。参见docs:
您想使用性能优化技术,例如deferred 字段:
queryset = Pizza.objects.only('name')
餐厅= Restaurant.objects.prefetch_related(Prefetch('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))
答案 1 :(得分:0)
也许这种情况适合您的情况?
B.objects.select_related('a').defer('a__field_to_lazy_load');
这将从两个模型中加载所有字段,除了您在defer()中指定的字段外,您可以在其中使用常规的Django双下划线约定遍历关系。
您在defer()中指定的字段不会从数据库中加载,但是如果您以后尝试访问它们(例如,在模板中),它们将会被加载。