![](/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.