Django夹具主键错误,需要自然键解决方案

Django夹具主键错误,需要自然键解决方案,django,django-models,primary-key,natural-key,Django,Django Models,Primary Key,Natural Key,因此,我有一个电影模型,其中包含多对多领域的演员模型列表: 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.SmallIntegerFie

因此,我有一个电影模型,其中包含多对多领域的演员模型列表:

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 fixture加载一些初始数据,但是我遇到的问题是加载多对多参与者字段。 例如,我得到一个错误:

反序列化错误:[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

但是我仍然得到相同的错误

输入和
自然键
方法都有问题

国家:

自然键是值的元组,可用于唯一 标识对象实例而不使用主键值

Person
natural\u key
方法应该返回一个元组

def natural_key(self):
    return (self.full,)
序列化输入还应包含自然键的元组/列表

{
    "pk": 1, 
    "model": "data.film", 
    "fields": {
        "actors": [
            [
                "Matt Damon"
            ], 
            [
                "Jodie Foster"
            ]
        ], 
        "name": "Elysium", 
        "year": 2013
    }
}

您是先加载actors装置吗?谢谢,我想这解决了问题,但是现在我收到一个错误,声明:反序列化错误:get()返回了多个人--它返回了2!查找参数为{'full':'FitzGerald,James(I)}。我相信这可能是因为我的actor fixture中加载了重复的条目,有没有办法忽略fixture中的重复数据?我以为我在创建装置时已经用集合编程了,但我想没有。实际上,通过查看我的个人装置,我没有看到它的副本,因此我没有任何线索。虽然您不需要在数据库级别强制执行自然关键点的唯一性,但建议您这样做。我会在
full
字段中添加一个
unique=True
,以防止将来重复。清除/放下桌子,然后再次尝试重新加载固定装置。以前的部分加载可能已经创建了重复项。我尝试将unique=True添加到我的完整字段中,但会出现错误,我将其更改为CharField,从而使其正常工作。然而,在重置应用程序并重新加载我的演员装置后,我得到IntegrityError:无法加载数据。Person(pk=89388):(1062,“重复输入‘de Santiago,Carlos’表示键‘full’”),尽管我查看了装置,但显然没有重复项。有什么命令可以让它忽略重复项吗?事实上,我找到了重复项…有一个人的名字完全相同,只是在“De Santiago”中有一个大写字母,我猜django将这些视为不区分大小写的…希望修复后能最终修复一切。