繁体   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