Django自然键的装置给出反序列化错误 [英] Django Natural Key for Fixtures Give Deserialization Error
问题描述
在SO上我看到了一些类似的问题,但似乎没有回答我的特殊问题。我是Django的新手,并按照此页面的指示进行指导允许自己使用自然键加载灯具。然而,我得到了反序列化错误,因为Django想要一个外键的整数,似乎没有将我的自然键映射到一个整数主键,如说明中所述。具体来说,我的相关模型代码是:
I've seen a few similar questions to this on SO, but none seem to answer my particular problem. I'm new to Django and was guiding myself by the instructions at this page to allow myself to use natural keys to load fixtures. Nevertheless, I'm getting Deserialization errors because Django wants an integer for a foreign key and can't seem to map my natural key to an integer primary key as is noted in the instructions. Specifically, my relevant models code is:
class GraphTypeManager(models.Manager):
def get_by_natural_key(self, type):
return self.get(type=type)
class GraphType(models.Model):
type = models.CharField(max_length=100, unique=True)
class GraphManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Graph(models.Model):
name = models.CharField(max_length=200, unique=True)
type = models.ForeignKey(GraphType)
class LineManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Line(models.Model):
name = models.CharField(max_length=200, unique=True)
class GraphToLineManager(models.Manager):
def get_by_natural_key(self, line, graph):
return self.get(line=line,graph=graph)
class GraphToLine(models.Model):
line = models.ForeignKey(Line)
graph = models.ForeignKey(Graph)
class Meta:
unique_together = (('line', "graph"),)
我的YAML夹具是:
- model: graphs_container.GraphType
pk: null
fields:
type: TimeSeries
- model: graphs_container.Graph
pk: null
fields:
name: LikesOverTime
type: [TimeSeries]
- model: graphs_container.Graph
pk: null
fields:
name: UsersOverTime
type: [TimeSeries]
- model: graphs_container.Line
pk: null
fields:
name: NumUsers
- model: graphs_container.Line
pk: null
fields:
name: NumLikes
但是当尝试运行 python manage.py loaddata sample_data.yaml
,我收到以下错误:
But when trying to run python manage.py loaddata sample_data.yaml
, I get the following error:
DeserializationError: [u"'['TimeSeries']' value must be an integer."]
我做错了什么?
推荐答案
您需要
- 定义
natural_key
模型 - 拥有一个管理员,具有
get_by_natural_key
方法 - 实际附加经理(
objects = GraphManager()
)
- define
natural_key
method in your models - have a manager with
get_by_natural_key
method - actually attach the managers (
objects=GraphManager()
)
播放代码后,我使其工作:
$ b
After playing with your code, I made it work:
class GraphTypeManager(models.Manager):
def get_by_natural_key(self, type):
return self.get(type=type)
class GraphType(models.Model):
type = models.CharField(max_length=100, unique=True)
objects = GraphTypeManager()
def natural_key(self):
return (self.type,) # must return a tuple
class GraphManager(models.Manager):
def get_by_natural_key(self, name):
return self.get(name=name)
class Graph(models.Model):
name = models.CharField(max_length=200, unique=True)
type = models.ForeignKey(GraphType)
objects = GraphManager()
转储数据:
$ bin/django dumpdata index --indent=4 --natural > project/apps/fixtures_dev/initial_data.json
[
{
"pk": 1,
"model": "index.graphtype",
"fields": {
"type": "asotuh"
}
},
{
"pk": 1,
"model": "index.graph",
"fields": {
"type": [
"asotuh"
],
"name": "saoneuht"
}
}
]
bin/django loaddata project/apps/fixtures_dev/initial_data.json
Installed 2 object(s) from 1 fixture(s)
这篇关于Django自然键的装置给出反序列化错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!