从Django QuerySet获取所有值以及相关模型的其他字段

时间:2018-10-05 16:44:24

标签: 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.PositiveIntegerField(null=True)

现在我可以像这样使用values()函数

B.objects.values('y', 'a__text')

获取包含来自B模型的指定值和来自A模型的实际字段的元组。如果我只使用

B.objects.values()

我只得到包含来自B模型的字段的元组(即y和外键ID a)。让我们假设一个场景,其中BA有很多字段,而我对属于B的所有字段都感兴趣,但仅对A.中的单个字段感兴趣values()调用中的字段名称是可能的,但乏味且容易出错。

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

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

2 个答案:

答案 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()中指定的字段不会从数据库中加载,但是如果您以后尝试访问它们(例如,在模板中),它们将会被加载。