我正在尝试从模型中延迟字段,但是.defer()似乎不起作用。
我正在使用python 2.7运行Django 1.9。
(示例代码,简化)
class MyModelA(models.Model):
title = models.CharField(max_lenght=50)
file = models.FileField(upload_to='test/')
class MyModelB(models.Model):
title = models.CharField(max_lenght=50)
defer_this = models.ManyToManyField(MyModelA, blank=True)
query = MyModelB.objects.defer('defer_this')
for i in query:
print i.title, i.defer_this.all()
它会打印defer_this对象。
有人可以解释一下它是如何工作的/为什么会这样?
答案 0 :(得分:0)
根据文档
如果在某些情况下使用查询集的结果 最初时不知道是否需要这些特定字段 提取数据,您可以告诉Django不要从 数据库。
这是通过将不加载的字段名称传递给defer()
来完成的具有延迟字段的查询集仍将返回模型实例。 如果您访问,则将从数据库中检索每个延迟的字段 该字段(一次一个,不是一次所有延迟的字段)
这意味着defer不会阻止您访问传递给defer
的属性。它只是不会从数据库中获取它。当您(尝试)访问延迟属性时。然后它将从数据库中获取它。
如果是M2M字段,则默认(类似)将其推迟。当查询包含M2M字段的模型时,django将不会进行联接并从相关表中获取数据。您必须使用prefetch_related
和selected_related
明确地告诉django进行联接和获取相关数据。