我在 SO 上看到了一些与此类似的问题,但似乎没有一个能回答我的特定问题。我是 Django 的新手,并按照 this page 的说明指导自己,以允许自己使用自然键来加载设备。尽管如此,我还是收到了反序列化错误,因为 Django 需要一个整数作为外键,并且似乎无法将我的自然键映射到一个整数主键,如说明中所述。具体来说,我的相关模型代码是:

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 时,我收到以下错误:
DeserializationError: [u"'['TimeSeries']' value must be an integer."]

我究竟做错了什么?

最佳答案

你需要

  • 在你的模型中定义 natural_key 方法
  • 有一个使用 get_by_natural_key 方法
  • 的经理
  • 实际上附加了经理 ( objects=GraphManager() )

  • 在玩过你的代码后,我让它工作了:
    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)
    

    关于python - 用于固定装置的 Django 自然键给出反序列化错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12577446/

    10-12 20:21