Django中同时保存对象及其相关对象
Saving objects and their related objects at the same time in Django
在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 然后保存标签,因为如果 post.save()
成功,然后 tag.save()
失败,我只剩下 Post 没有标签。
在 Django 中有没有办法一次性保存所有这些或者至少强制执行更好的数据完整性?
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')]
附带说明:我认为您真的想要 Post
和 Tag
之间的多对多关系...
覆盖保存...
class Post(models.Model):
...
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
for tag in self.tag_set:
tag.save()
这样你就不用一遍又一遍地写交易的东西了。如果要使用事务,直接在save方法中实现即可,不用循环
在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 然后保存标签,因为如果 post.save()
成功,然后 tag.save()
失败,我只剩下 Post 没有标签。
在 Django 中有没有办法一次性保存所有这些或者至少强制执行更好的数据完整性?
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')]
附带说明:我认为您真的想要 Post
和 Tag
之间的多对多关系...
覆盖保存...
class Post(models.Model):
...
def save(self, *args, **kwargs):
super(Post, self).save(*args, **kwargs)
for tag in self.tag_set:
tag.save()
这样你就不用一遍又一遍地写交易的东西了。如果要使用事务,直接在save方法中实现即可,不用循环