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

Sey*_*ini 2 python mysql django database-relations django-models

我使用 Django 2.0 和 mysql 数据库,我的项目模型是这样的:

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

class Child(models.Model):
    number = models.IntegerField()
    parent = models.ForeignKey(Parent)
Run Code Online (Sandbox Code Playgroud)

我想要的是同时将父对象和子对象保存在一起,以便在任何情况下子对象有错误(例如数字字段是“某些文本”)并且无法保存父对象不会保存。

在 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()
Run Code Online (Sandbox Code Playgroud)

我想要的是这样的:

parent = Parent(name = "my name")
child = Child(number=3, parent=parent)
Run Code Online (Sandbox Code Playgroud)

进而:

child.save(with related parent)
Run Code Online (Sandbox Code Playgroud)

或者:

save(parent, child together)
Run Code Online (Sandbox Code Playgroud)

PS:我阅读了这个链接,我认为“SET”方法是我所需要的,但我不确定如何使用它以及它是否是解决方案: django关系

bak*_*kal 6

我想要的是同时将父对象和子对象保存在一起,这样如果在任何情况下子对象有错误 [...] 并且无法保存,父对象也不会保存。

在我看来,您可以为此使用数据库事务。在一个事务中,要么所有操作都通过,要么所有操作都回滚,没有半途而废(没有在您的情况下保存父级,则不会保存子级)

下面是一个使用示例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
Run Code Online (Sandbox Code Playgroud)