【问题标题】:How can i defer a many to many field from object?如何从对象推迟多对多字段?
【发布时间】:2019-09-19 07:23:02
【问题描述】:

我试图从我的模型中延迟一个字段,但 .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 对象。

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

【问题讨论】:

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


    【解决方案1】:

    根据文档

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

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

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

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

    在 M2M 字段的情况下,默认情况下(有点)它们是延迟的。当您查询包含 M2M 字段的模型时,django 不会进行连接并从相关表中获取数据。您必须使用prefetch_relatedselected_related 明确告诉django 进行连接和获取相关数据。

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2019-09-18
      • 2017-12-12
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      相关资源
      最近更新 更多