相关疑难解决方法(0)

与经理相关的Django重复查询

我正在优化我的 ORM 查询。我有两个应用程序,“app1”和“app2”。一类“app2”具有指向一类 app1 的外键,如下所示:

#app1/models.py
class C1App1(WithDateAndOwner):
  def get_c2_app2(self):
    res = self.c2app2_set.all()
    if res.count() > 0:
      return res[0]
    else:
      return None

#app2/models.py
class C2App2(WithDateAndOwner):
  c1app1 = models.ForeignKey("app1.C1App1")
  is_ok = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

现在我在管理页面中显示 C1App1 的所有实例的 C2App2:

#app1/admin.py
@admin.register(C1App1)
class C1App1Admin(admin.MyAdmin):
  list_display = ("get_c2_app2")
  list_select_related = ()
  list_prefetch_related = ("c2app2_set",)
  list_per_page = 10
Run Code Online (Sandbox Code Playgroud)

prefetch_related 减少这个查询:

SELECT ••• FROM `app2_c2app2` WHERE `app2_c2app2`.`c1app1_id` = 711
  Duplicated 19 times.
Run Code Online (Sandbox Code Playgroud)

到:

SELECT ••• FROM `app2_c2app2` WHERE `app2_c2app2`.`c1app1_id` IN (704, 705, 706, 707, 708, 709, 710, 711, …
Run Code Online (Sandbox Code Playgroud)

django prefetch django-admin django-queryset

3
推荐指数
1
解决办法
626
查看次数

标签 统计

django ×1

django-admin ×1

django-queryset ×1

prefetch ×1