【发布时间】:2021-12-19 04:04:59
【问题描述】:
似乎找不到太多关于此的信息。这不会发生在 django 测试中。我正在使用DATABASES = { ATOMIC_REQUESTS: True }。在视图调用的方法(在我创建的 mixin 中)中,我正在尝试执行以下操作:
def process_valid(self, view):
old_id = view.object.id
view.object.id = None # need a new instance in db
view.object.save()
old_fac = Entfac.objects.get(id=old_id)
new_fac = view.object
old_dets = Detfac.objects.filter(fk_ent__id__exact = old_fac.id)
new_formset = view.DetFormsetClass(view.request.POST, instance=view.object, save_as_new=True)
if new_formset.is_valid():
new_dets = new_formset.save()
new_fac.fk_cancel = old_fac # need a fk reference to initial fac in new one
old_fac.fk_cancel = new_fac # need a fk reference to new in old fac
# any save() action after this crashes with TransactionManagementError
new_fac.save()
我不明白这个错误。我已经在 db 中创建并保存了一个新对象(当我将 object.id 设置为 None 并保存它时)。为什么创建其他对象会造成进一步保存的问题?
我尝试不使用 Formset 实例化 new_dets 对象,而是明确定义它们:
new_det = Detfac(...)
new_det.save()
但话又说回来,此后任何进一步的保存都会引发错误。
更多细节:
基本上,我有一个Entfac 模型和一个Detfac 模型,它有一个指向Entfac 的外键。我需要为新的Entfac 实例化一个新的Enfac(在数据库中不同),以及相应的新Detfac。然后我需要更改新旧对象的某些字段中的一些值,并将所有这些值保存到 db。
【问题讨论】:
标签: django django-orm