使用此模型属性减少数据库负载

发布于 2024-11-10 10:15:59 字数 579 浏览 1 评论 0原文

我的模型中有以下代码,用于确定 Entry 是否可计费:

class Entry(models.Model):
    [ .. ]
    @property
    def is_billable(self):
        return self.tags.filter(billable=False).count() == 0

Entry 有一个 FK to Project。在确定 Project 的剩余预算时,我循环遍历所有条目,并检查 is_billable 是否返回 True:

@property
def remaining_budget(self):
    [ .. ]
    for entry in self.entry_set.all():
        if entry.is_billable:
            remaining_budget -= entry.minutes

这对于数据库来说有点繁重,因为它会对每个条目触发一个查询。我正在寻找一种优化方法,欢迎提供提示和提示。

I have the following code in my model, which determines if an Entry is billable:

class Entry(models.Model):
    [ .. ]
    @property
    def is_billable(self):
        return self.tags.filter(billable=False).count() == 0

Entry has an FK to Project. When determining the remaining budget on a Project, I loop through all the entries, and check if is_billable returns True:

@property
def remaining_budget(self):
    [ .. ]
    for entry in self.entry_set.all():
        if entry.is_billable:
            remaining_budget -= entry.minutes

Which is kind of heavy for the database, because it'll fire a query for each Entry. I'm looking for a way to optimize this, tips and hints are welcome.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

纵性 2024-11-17 10:15:59

如果您需要摆脱计数查询,那么为什么不:

  1. 向您的 Entry 模型添加一个 is_billable 字段,
  2. 根据标签对象写入信号以将此字段设置为 True 或False(如果添加了 is_billable == True 的新标签,则将其设置为 True / 如果删除了标签并且没有保留 is_billable == True 的标签,则将其设置为 True它是假的,等等)

的当然,如果您的数据可以通过其他应用程序或手动更改,则不应首选此方法。

If you need to get rid of the count query then why not:

  1. Add an is_billable field to your Entry model
  2. Write signals based on the tag objects to set this field to True or False (if a new tag with is_billable == True is added, then set it True / if a tag is removed and no tags with is_billable == True remain, then set it False, etc)

Of course if your data can be changed through other apps or manually, this method should not be preferred.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文