Django一对一字段反向更新
Django one-to-one field reverse update
我在以一对一关系保存反向对象时遇到问题。根据 Django 文档,使用 save() 方法后一切正常(https://docs.djangoproject.com/en/1.9/topics/db/examples/one_to_one/)。
但是我的情况不同:
class A(models.Model):
name = models.CharField(max_length=30)
class B(models.Model):
name = models.CharField(max_length=30)
aObject = models.OneToOneField(A, on_delete=models.SET_NULL, null=True, blank=True)
我首先创建多个B对象并将它们保存到数据库中。然后我创建多个 A 对象,将它们映射到相应的 B 对象。然后我使用 bulk_create() 保存 A 对象,最后使用 save().
保存修改后的 B 对象
我收到一个错误:
ValueError: save() prohibited to prevent data loss due to unsaved related object 'aObject'.
似乎在 A 对象上使用 bulk_create 不会执行 save() 会执行的某些操作。
我该如何解决这个问题? (出于性能原因,我需要使用 bulk_create)
谢谢
当您使用 bulk_create
时,Django 不会获取新对象的主键。因此,无法将新对象用作一对一字段、多对多字段或外键的值。
Django 1.10 将支持在使用 bulk_create()
for PostgreSQL 创建的对象上设置主键。在那之前,以及其他数据库后端,恐怕你运气不好。
有关详细信息,请参阅 the docs。
我在以一对一关系保存反向对象时遇到问题。根据 Django 文档,使用 save() 方法后一切正常(https://docs.djangoproject.com/en/1.9/topics/db/examples/one_to_one/)。
但是我的情况不同:
class A(models.Model):
name = models.CharField(max_length=30)
class B(models.Model):
name = models.CharField(max_length=30)
aObject = models.OneToOneField(A, on_delete=models.SET_NULL, null=True, blank=True)
我首先创建多个B对象并将它们保存到数据库中。然后我创建多个 A 对象,将它们映射到相应的 B 对象。然后我使用 bulk_create() 保存 A 对象,最后使用 save().
保存修改后的 B 对象我收到一个错误:
ValueError: save() prohibited to prevent data loss due to unsaved related object 'aObject'.
似乎在 A 对象上使用 bulk_create 不会执行 save() 会执行的某些操作。
我该如何解决这个问题? (出于性能原因,我需要使用 bulk_create)
谢谢
当您使用 bulk_create
时,Django 不会获取新对象的主键。因此,无法将新对象用作一对一字段、多对多字段或外键的值。
Django 1.10 将支持在使用 bulk_create()
for PostgreSQL 创建的对象上设置主键。在那之前,以及其他数据库后端,恐怕你运气不好。
有关详细信息,请参阅 the docs。