在Django中同时保存对象及其相关对象

时间:2016-11-28 16:36:38

标签: python django django-models django-orm

在Django中,有没有办法创建一个对象,创建它的相关对象,然后立即保存它们?

例如,在下面的代码中:

from django.db import models


class Post(models.Model):
    title = models.CharField(max_length=255)
    body = models.CharField(max_length=255)


class Tag(models.Model):
    post = models.ForeignKey(Post)
    title = models.CharField(max_length=255)

post = Post(title='My Title', body='My Body')
post.tag_set = [Tag(post=post, title='test tag'), Tag(post=post, title='second test tag')]
post.save()

我创建了一个Post对象。然后我还想创建并关联我的Tag对象。我想避免保存帖子然后保存标签,因为如果post.save()成功,那么tag.save()会失败,我会留下没有标签的帖子。

Django有没有办法一次性保存这些内容或者至少可以实现更好的数据完整性?

2 个答案:

答案 0 :(得分:8)

transactions救援!

from django.db import transaction

with transaction.atomic():
   post = Post.objects.create('My Title', 'My Body')
   post.tag_set = [Tag(post, 'test tag'), Tag(post, 'second test tag')]

作为旁注:我认为你真的想要PostTag之间的多对多关系...

答案 1 :(得分:1)

覆盖保存...

<NodeC />

这样您就不必一遍又一遍地编写事务。如果要使用事务,只需在save方法中实现它,而不是执行循环。