将父级和子级模型对象保存在一起

时间:2017-12-25 03:29:54

标签: python mysql django django-models database-relations

我使用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

1 个答案:

答案 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