2

だから私は、多対多フィールドでActorsモデルのリストを保持するFilmモデルを持っています:

class Person(models.Model):
    full = models.TextField()
    short = models.TextField()
    num = models.CharField(max_length=5)

class Film(models.Model):
    name = models.TextField()
    year = models.SmallIntegerField(blank=True)
    actors = models.ManyToManyField('Person')

JSON フィクスチャからいくつかの初期データをロードしようとしていますが、問題は多対多のアクター フィールドをロードすることです。たとえば、次のエラーが表示されます。

DeserializationError: [u"'Anna-Varney' 値は整数でなければなりません。"]

これらのフィクスチャで:

  {
    "pk": 1,
    "model": "data.Film",
    "fields": {
      "actors": [
        "Anna-Varney"
      ],
      "name": "Like a Corpse Standing in Desperation (2005) (V)",
      "year": "2005"
    }

私のアクターのフィクスチャは次のようになります。

 {
    "pk": 1,
    "model": "data.Person",
    "fields": {
      "full": "Anna-Varney",
      "num": "I",
      "short": "Anna-Varney"
    }
  }

したがって、多対多のフィールドは pk 整数を使用する必要がありますが、問題はデータがソートされていないことであり、アクターの長いリストの場合、それぞれの pk を手動で検索するのは実用的ではないと思います。私は解決策を探していましたが、自然キーを使用する必要があるようですが、モデルにそれらを適用する方法が正確にはわかりません。

編集:私は自分のモデルを次のように変更しました:

class PersonManager(models.Manager):
    def get_by_natural_key(self, full):
        return self.get(full=full)

class Person(models.Model):
    objects = PersonManager()
    full = models.TextField()
    short = models.TextField()
    num = models.CharField(max_length=5)
    def natural_key(self):
        return self.full

しかし、私はまだ同じエラーが発生しています

4

1 に答える 1

3

natural_key入力とメソッドの両方に問題があります。

ドキュメンテーション: Django オブジェクトのシリアル化 - 自然キーの状態:

自然キーは、主キー値を使用せずにオブジェクト インスタンスを一意に識別するために使用できる値のタプルです。

Personnatural_keyメソッドはタプルを返す必要があります

def natural_key(self):
    return (self.full,)

シリアル化された入力には、自然キーのタプル/リストも含まれている必要があります。

{
    "pk": 1, 
    "model": "data.film", 
    "fields": {
        "actors": [
            [
                "Matt Damon"
            ], 
            [
                "Jodie Foster"
            ]
        ], 
        "name": "Elysium", 
        "year": 2013
    }
}
于 2013-08-11T04:54:16.040 に答える