Python 从Django QuerySet获取所有值,并从相关模型获取其他字段
我想知道是否有一种快捷方式可以从Django模型获取所有字段,并且只定义通过联接(或多个联接)检索的其他字段 考虑以下模型: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
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
和外键ida
)。让我们假设一个场景,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将在一个查询中使用联接。