所以我有一个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 fixtures加载一些初始数据,但是我遇到的问题是加载了很多到很多actor字段。 例如,我收到错误:
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
但我仍然得到同样的错误
答案 0 :(得分:3)
输入和natural_key
方法都存在问题。
Documentation: Serializing Django objects - natural keys州:
自然键是元组值,可用于唯一 在不使用主键值的情况下标识对象实例。
Person natural_key
方法应该返回一个元组
def natural_key(self):
return (self.full,)
序列化输入还应包含自然键的元组/列表。
{
"pk": 1,
"model": "data.film",
"fields": {
"actors": [
[
"Matt Damon"
],
[
"Jodie Foster"
]
],
"name": "Elysium",
"year": 2013
}
}