我试图从我的模型推迟一个字段,但.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对象。
有人可以解释一下它是如何工作的/为什么会发生这种情况?
根据文件
如果您在最初获取数据时不知道是否需要这些特定字段的情况下使用查询集的结果,则可以告诉Django不要从数据库中检索它们。
这是通过将字段名称传递给defer()来完成的。
具有延迟字段的查询集仍将返回模型实例。如果您访问该字段(一次一个,而不是一次所有延迟字段),将从数据库中检索每个延迟字段
这意味着延迟并不会阻止您访问传递给defer
的属性。它不会从数据库中获取它。当您(尝试)访问延迟属性时。它会从db获取它。
在M2M字段的情况下,它们默认(种类)延迟。当您查询包含M2M字段的模型时,django将不会进行连接并从相关表中获取数据。你必须使用prefetch_related
和selected_related
明确告诉django来连接和获取相关数据。