一起保存 parent 和 child 模型 object

Save parent and child model object together

我使用 Django 2.0 和 mysql 数据库,我的项目模型如下:

class Parent(models.Model):
    name = models.CharField()

class Child(models.Model):
    number = models.IntegerField()
    parent = models.ForeignKey(Parent)

我想要的是同时保存 parent 和 child object,这样如果 child object有错误(比如数字字段是 "some text")并且无法保存 parent object 不会保存。

在 Flask(带有 postgresql)中有 add(object) 和 add_all([parent, child]) 方法,我使用了 add_all 所以如果 child 有错误 parent 也不会保存。

但是在 Django 中我找不到这个方法。

默认方法是:

parent = Parent(name = "my name")
parent.save()

child = Child(number=3, parent=parent)
child.save()

我想要的是这样的:

parent = Parent(name = "my name")
child = Child(number=3, parent=parent)

然后:

child.save(with related parent)

或:

save(parent, child together)

PS:我读了这个 link,我认为 "SET" 方法是我需要的,但我不确定如何使用它以及它是否是解决方案: django relations

What I want is to save both parent and child object together at the same time so that if in any case the child object has error [...] and can not be saved the parent object doesn't save.

在我看来,您可以为此使用 database transaction。在事务中,要么所有操作都通过,要么所有操作都回滚,没有中途(在您的情况下,如果没有保存父项,则不会保存子项)

下面是一个使用 transaction.atomic 的例子:

from django.db import DatabaseError, transaction
try:
    with transaction.atomic():
        parent = Parent(name = "my name")
        parent.save()

        child = Child(number=3, parent=parent)
        child.save()

except DatabaseError:
    # Handle the case where an error prevented the operation