Python 从Django QuerySet获取所有值,并从相关模型获取其他字段

Python 从Django QuerySet获取所有值,并从相关模型获取其他字段,python,django,django-queryset,Python,Django,Django Queryset,我想知道是否有一种快捷方式可以从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.Posi

我想知道是否有一种快捷方式可以从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)
现在我可以使用这样的函数了

B.objects.values('y', 'a__text')
B
模型获取包含指定值的元组,并从
A
模型获取实际字段。如果我只使用

B.objects.values()
我只得到包含
B
模型字段的元组(即
y
和外键id
a
)。让我们假设一个场景,
B
a
有许多字段,我对属于
B
的所有字段都感兴趣,但只对
a中的一个字段感兴趣。
手动指定
values()
调用中的所有字段名是可能的,但繁琐且容易出错

那么,有没有一种方法可以指定我需要所有本地字段,但只需要(少数)个特定的联接字段


注意:我目前正在使用Django 1.11,但如果解决方案只适用于较新的版本,我也对此感兴趣。

对此,您可以使用
预回迁相关的
。见:

您希望使用性能优化技术,如延迟 字段:

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

餐厅=餐厅.对象.预回迁相关(预回迁('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()中指定的字段除外,在defer()中可以使用常用的Django双下划线约定遍历关系


您在defer()中指定的字段不会从数据库中加载,但如果您稍后尝试访问它们(例如在模板中),则会加载这些字段。

鉴于B属于a,这种情况下是否需要选择相关而不是预取相关?假设您使用B.objects…。@fabio.sussetto
prefetch\u related
也可以与单个相关对象一起使用。从文档中:
自定义预取也适用于单个相关关系,如forward ForeignKey或OneToOneField。在许多情况下,使用自定义查询集进行预取是有用的
。我明白了,感谢您的澄清,我有点忘记了您可以将预取相关作为更灵活的选择相关。我想另一个区别是,使用prefetch\u related时,您总是会看到一个额外的查询,而select\u related将在一个查询中使用联接。