问题描述
我使用 django-polymorphic
如下。
MyBase
是一个多态基类,有 4 个子类 A
、'B'、'C'、'D'。
D
有 FK 到 C
,C
有 FK 到 B
,而 B
有 FK 到 A
。 A
...D
中的每一个都将具有子集关系。例如a.b_set.all()
、b.c_set.all()
和 c.d_set.all()
我还有一个普通模型 Tag
,它有一个到“MyBase”的 FK,通过分配给 A
、B
、C
或 {{1} }. 所以每一个D
...A
都会有子集关系。例如D
、a.tag_set.all()
、b.tag_set.all()
和c.tag_set.all()
遍历这个嵌套的层次结构似乎会产生大量的 DB 命中。我曾尝试使用 d.tag_set.all()
和 prefetch_related()
并取得了一些成功,但没有我希望的那么多。
注意:我的数据库 django-auto-prefetch
在带有 emmC 存储的 RaspBerry Pi 类平台上运行。
sqlite3
是一种正确的工具,可以在检索嵌套数据集时减少数据库负载并减少延迟。示例:
django-polymoriphic-tree
我试图解决的问题是,一个 Web 仪表板需要大约 75 毫秒才能加载 85 个查询(这是我使用大量 for a in A.objects.all():
print( f"a = {a}" )
for tag in a.tag_set.all():
print( f"a.tag = {tag}" )
for b in a.b_set.all():
print( f"b = {b}" )
for tag in b.tag_set.all():
print( f"b.tag = {tag}" )
for c in b.c_set.all():
print( f"c = {c}" )
for tag in c.tag_set.all():
print( f"c.tag = {tag}" )
for d in c.d_set.all():
print( f"d = {d}" )
for tag in d.tag_set.all():
print( f"d.tag = {tag}" )
装饰器所能得到的最好结果)。我有另一个过程可以有效地获取相同的数据(来自 django ORM 但不使用管理框架)以显示在 LCD 上,但检索需要大约 250 毫秒。我不确定区别在哪里(可能是 web/html 缓存),但我想将数据库负载降至最低。
@cached_property
是正确的工具 - 还是有更合适的工具?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)