3

自然キーを介して参照されるモデルが既存のレコードと競合しないように、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 レコードを再利用するのではなく、再作成しようとするのはなぜですか?

4

2 に答える 2

0

実際、loaddata はデータベース内の既存のデータで動作することは想定されておらず、通常はモデルの初期ロードに使用されます。別の方法については、この質問を参照してください: Import data into Django model with existing data?

于 2012-06-10T09:11:31.900 に答える