2

所以我有一个 Film 模型,其中包含多对多领域的 Actors 模型列表:

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 回答