gpt4 book ai didi

M2M 的 Django 性能

转载 作者:行者123 更新时间:2023-12-04 06:21:02 26 4
gpt4 key购买 nike

我有一个看起来像这样的模型:

class ParentObject(models.Model):
...
services = models.ManyToManyField(Service)

class ChildObject(models.Model):
parent = models.ForeignKey(ParentObject)
services = models.ManyToManyField(Service)

class Service(models.Model):
name = ...
description = ...

因此,总而言之,一个对象具有附加的服务列表,而子对象必须附加其他服务。

在规模上,每个家长都有一个 50-60 个服务的列表,每个 child (每个家长 5 个)都有一个 30-40 个服务的列表。在 django-admin(使用 grappelli 顺便说一句)中,我已将 Child 设置为内联。

问题是 admin 中的页面加载非常困难(3-5 秒),因为 Django Admin 执行大约 1200 个查询(每次获取服务 - 有时多次)以向我显示要编辑的信息。

您知道优化此功能的任何提示/技巧吗?

先感谢您。

最佳答案

我没有玩过 grappelli,但在标准的 django-admin 中我会考虑使用:ModelAdmin.raw_id_fields。
限制是您不使用名称选择服务,而是使用 pk。

By default, Django's admin uses a select-box interface () for fields that are ForeignKey. Sometimes you don't want to incur the overhead of having to select all the related instances to display in the drop-down.

raw_id_fields is a list of fields you would like to change into an Input widget for either a ForeignKey or ManyToManyField:


class ArticleAdmin(admin.ModelAdmin):
raw_id_fields = ("newspaper",)

更难的方法是覆盖服务的管理管理器并添加请求级缓存。请记住,在兴高采烈的对象访问的情况下,使此管理器可用。

关于M2M 的 Django 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6562893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com