我使用Django 2.0和mysql数据库,我的项目模型如下:
class Parent(models.Model):
name = models.CharField()
class Child(models.Model):
number = models.IntegerField()
parent = models.ForeignKey(Parent)
我想要的是同时将父对象和子对象保存在一起,以便在任何情况下子对象都有错误(如数字字段是"某些文本")并且无法保存父对象没有保存。
在Flask(使用postgresql)中有add(object)和add_all([parent,child])方法,我使用add_all,所以如果孩子有错误,父母也不会保存。
但是在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:我读过这个链接,我认为" SET"方法是我需要的,但我不知道如何使用它,如果它是解决方案: django relations
答案 0 :(得分:3)
我想要的是同时将父对象和子对象保存在一起,这样如果在任何情况下子对象都有错误[...]并且无法保存,则父对象不会保存。
对我而言,就像你可以使用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