【问题标题】:Lazy Load Django Admin Inlines延迟加载 Django 管理内联
【发布时间】:2015-06-23 15:58:43
【问题描述】:

我有一个包含多达 20 个字段的模型。在另一个使用直通表引用它的模型中,它也被称为 ManytoMany。让我在这里放一个场景来展示我的情况。

class Class1(models.Model):
  some_field = .....
  myfield1 = models.ManyToManyField(Class2,through='Another')
  ......

class Another(models.Model):
   class1 = models.ForeignKey(Class1, related_name='class1_class2')
   class2 = models.ForeignKey(Class2, related_name='class1_class2')

“另一个”是一个管理内联字段,使用 Django 的默认管理 UI。问题是,如果“Another”的对象太多而加载了许多其他类 1 和类 2 的对象,NGINX 会给我 502: Bad Gateway

我不愿意增加 NGINX 时间,我已经做过很多次了。我想知道的是,如果有一种方法我可以说 Django Admin 仅在加载所有其他内容后才加载内联,或者说延迟加载内联。

我几乎浏览了所有关于 Django 中的延迟加载的帖子,但它们都适用于特定的视图或字段,我没有发现任何接近我需要的东西。

如果有人能对此有所了解,我将非常感激。

问候。

【问题讨论】:

    标签: python django nginx lazy-loading inline-formset


    【解决方案1】:

    使用 defer 可能会满足您的需求...

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#defer

    推迟

    延迟(*字段) 在一些复杂的数据建模情况下,您的模型可能包含很多字段,其中一些可能包含大量数据(例如,文本字段),或者需要进行昂贵的处理才能将它们转换为 Python 对象。如果您在最初获取数据时不知道是否需要这些特定字段的情况下使用查询集的结果,您可以告诉 Django 不要从数据库中检索它们。

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

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

    您可以多次调用 defer()。每次调用都会向延迟集添加新字段:

    延迟正文和标题字段。

    Entry.objects.defer("body").filter(rating=5).defer("headline") 将字段添加到延迟集中的顺序无关紧要。使用已被延迟的字段名称调用 defer() 是无害的(该字段仍将被延迟)。

    您可以延迟加载相关模型中的字段(如果相关模型是通过 select_related() 加载的),方法是使用标准的双下划线表示法来分隔相关字段:

    Blog.objects.select_related().defer("entry__headline", "entry__body") 如果要清除延迟字段集,请将 None 作为参数传递给 defer():

    立即加载所有字段。

    my_queryset.defer(无) 模型中的某些字段不会被延迟,即使您要求它们。您永远不能推迟加载主键。如果您使用 select_related() 来检索相关模型,则不应延迟加载从主模型连接到相关模型的字段,这样做会导致错误。

    【讨论】:

      猜你喜欢
      • 2012-02-15
      • 1970-01-01
      • 2016-07-01
      • 2016-06-12
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      相关资源
      最近更新 更多