如何从对象推迟多对多领域?

时间:2019-04-30 15:25:00

标签: python django many-to-many django-queryset deferred

我正在尝试从模型中延迟字段,但是.defer()似乎不起作用。

我正在使用python 2.7运行Django 1.9。

(示例代码,简化)


models.py


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)

views.py

query =  MyModelB.objects.defer('defer_this')

for i in query:
    print i.title, i.defer_this.all()


它会打印defer_this对象。

有人可以解释一下它是如何工作的/为什么会这样?

1 个答案:

答案 0 :(得分:0)

根据文档

  

如果在某些情况下使用查询集的结果   最初时不知道是否需要这些特定字段   提取数据,您可以告诉Django不要从   数据库。

     

这是通过将不加载的字段名称传递给defer()

来完成的      

具有延迟字段的查询集仍将返回模型实例。   如果您访问,则将从数据库中检索每个延迟的字段   该字段(一次一个,不是一次所有延迟的字段)

这意味着defer不会阻止您访问传递给defer的属性。它只是不会从数据库中获取它。当您(尝试)访问延迟属性时。然后它将从数据库中获取它。

如果是M2M字段,则默认(类似)将其推迟。当查询包含M2M字段的模型时,django将不会进行联接并从相关表中获取数据。您必须使用prefetch_relatedselected_related明确地告诉django进行联接和获取相关数据。