Django ORM 未存储在 try/except 块内

Django ORM not storing inside try/except block

我对 Django 存储对象有疑问。当我尝试在 try/except 块内做某事时,如果一切正常,我的对象将被保留。但如果引发异常(不是因为对象的 .save()),则不会存储任何内容。

一个例子:

def my_function(raise_exc):
  MyModel.objects.create(name='name')
  if raise_exc:
    raise Exception()
  return

成功案例:

raise_exc = False
try:
  my_function(raise_exc=raise_exc)
except Exception:
  pass

KO 案例:

raise_exc = True
try:
  my_function(raise_exc=raise_exc)
except Exception:
  pass

只有在 OK 情况下,MyModel 对象才会被持久化。通过调试,我可以看到,在这两种情况下,对象都是在 RAM 内存中创建的(MyModel.objects.all() 包含它),但不在数据库中。如果引发异常,看起来它会进行事务回滚(我没有使用事务块。以防万一)。

我不知道这是否是 ORM 所期望的行为。如果是,即使在保存对象后引发异常,我该怎么做才能将对象存储在 try 块中? (假设我不应该删除那个 try/except 包装器)

如果 ATOMIC_REQUESTS 在 settings.py

的数据库定义中设置为 TRUE,则这是默认行为

原子请求的文档状态:

Before calling a view function, Django starts a transaction. If the response is produced without problems, Django commits the transaction. If the view produces an exception, Django rolls back the transaction]1

DATABASES = {
    'default': {
        'ENGINE': '',
        'NAME': '',
        'USER': '',
        'PASSWORD': '!',
        'HOST': '127.0.0.1',   # Or an IP Address that your DB is hosted on
        'PORT': '',
        'ATOMIC_REQUESTS': True
    }
}

如果您想在代码引发异常时保留数据库事务,请将 ATOMIC_REQUESTS 设置为 False。