一起保存 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
我使用 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