gpt4 book ai didi

python - UPDATE不使用模型保存方法

转载 作者:行者123 更新时间:2023-12-01 04:57:35 24 4
gpt4 key购买 nike

如果我执行以下操作:

obj = Model.objects.get(pk=2)
object.field = 'new value'
object.save()

它运行我在 django 中编写的自定义保存方法。

但是,如果我执行正常的更新语句:

Model.objects.filter(pk=2).update(field='new value')

它不使用自定义保存方法。我的问题有两个:

  • 1) 为什么在 django 中做出这个决定——为什么不是每个“保存”都实现自定义保存方法。
  • 2) 是否有一种代码库范围内的方法来确保不执行任何 update 语句?基本上,我只是想确保每当在 django ORM 中进行保存时,自定义保存方法始终运行。这怎么可能?

最佳答案

我不是 Django 开发人员,但我时不时会涉猎一下,但还没有其他人回答。

Why was that decision made in django -- why doesn't every 'save' implement the custom save method.

我在这里猜测这是为了针对仅执行批量更新的常见情况进行速度优化。 update works on the SQL level因此,它可能比对大量对象调用 save 快得多,每个对象都有自己的数据库事务。

Is there a codebase-wide way to make sure that no update statements are ever made? Basically, I just want to ensure that the custom save method is always run whenever doing a save within the django ORM. How would this be possible?

您可以使用 custom manager使用自定义 QuerySet,每当调用 update 时都会引发一些异常。当然,如果您需要自定义行为,您可以始终循环查询集并在每个对象上调用save

禁止更新模型

from django.db import models

class NoUpdateQuerySet(models.QuerySet):
"""Don't let people call update! Muahaha"""
def update(self, **kwargs):
# you should raise a more specific Exception.
raise Exception('You shall not update; use save instead.')

class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)

# setting the custom manager keeps people from calling update.
objects = NoUpdateQuerySet.as_manager()

您只需将 NoUpdateQuerySet 设置为您不想更新的每个模型的管理器。不过,我真的认为没有必要设置自定义查询集;如果是我,我不会调用 update,而是在需要时循环遍历需要保存的对象。您可能会发现某个时候想要调用更新,而这最终会非常烦人。

禁止在项目范围内更新

如果您真的决定讨厌更新,您可以直接对更新方法进行猴子修补。然后你就可以完全确定它没有被调用。您可以在项目的 settings.py 中对其进行猴子修补,因为您知道该模块将被导入:

def no_update(self, **kwargs):
# probably want a more specific Exception
raise Exception('NO UPDATING HERE')

from django.db.models.query import QuerySet
QuerySet.update = no_update

请注意,回溯实际上会非常困惑,因为它将指向 settings.py 中的一个函数。我不确定其他应用使用了多少(如果有的话)update;这可能会产生意想不到的后果。

关于python - UPDATE不使用模型保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27027421/

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