自然キーを介して参照されるモデルが既存のレコードと競合しないように、Django フィクスチャをどのようにロードしますか?
私はそのようなフィクスチャをロードしようとしていますが、MySQL バックエンドから IntegrityErrors を受け取り、Django が重複したレコードを挿入しようとしていると不平を言っています。これは意味がありません。
Django の自然キー機能を理解しているので、dumpdata と loaddata の使用を完全にサポートするにnatural_key
は、モデルでメソッドを定義get_by_natural_key
し、モデルのマネージャーでメソッドを定義する必要があります。
たとえば、次の 2 つのモデルがあります。
class PersonManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Person(models.Model):
objects = PersonManager()
name = models.CharField(max_length=255, unique=True)
def natural_key(self):
return (self.name,)
class BookManager(models.Manager):
def get_by_natural_key(self, title, *person_key):
person = Person.objects.get_by_natural_key(*person_key)
return self.get(title=title, person=person)
class Book(models.Model):
objects = BookManager()
author = models.ForeignKey(Person)
title = models.CharField(max_length=255)
def natural_key(self):
return (self.title,) + self.author.natural_key()
natural_key.dependencies = ['myapp.Person']
私のテスト データベースには、フィクスチャの生成に使用したサンプルの Person および Book レコードが既に含まれています。
[
{
"pk": null,
"model": "myapp.person",
"fields": {
"name": "bob"
}
},
{
"pk": null,
"model": "myapp.book",
"fields": {
"author": [
"bob"
],
"title": "bob's book",
}
}
]
このフィクスチャをデータベースの任意のインスタンスにロードして、データベースに既に存在するかどうかに関係なく、レコードを再作成できるようにしたいと考えています。
ただし、実行するpython manage.py loaddata myfixture.json
とエラーが発生します。
IntegrityError: (1062, "Duplicate entry '1-1' for key 'myapp_person_name_uniq'")
Django が既存の Person レコードを再利用するのではなく、再作成しようとするのはなぜですか?