多表继承对象的Django dumpdata

时间:2016-09-10 03:47:30

标签: django django-models

我正在尝试./manage.py dumpdata --natural-foreign --natural-primary我的课程,这些课程是:

class SuperClassManager(Manager):
    def get_by_natural_key(self, identifier):
        return self.get(identifier=identifier)

class SuperClass(Model):
    objects = SuperClassManager()

    identifier = CharField(max_length=31, unique=True)

    def natural_key(self):
        return (self.identifier, )

class Class(SuperClass):
    pass

但转储的数据是:

[
{
    "model": "app.superclass",
    "fields": {
        "identifier": "identifier"
    }
},
{
    "model": "app.class",
    "fields": {}
}
]

在这种情况下,无法将Class实例与SuperClass实例相关联。我错过了什么?为什么superclass_ptr中存在的Class(指向SuperClass)被序列化,以便可以关联实例?

问题是:我的超类有多个子类,每个子类有很多实例。所以我需要这种关系,所以我的灯具才有意义。

2 个答案:

答案 0 :(得分:2)

这实际上是一个错误,补丁正在建设中:https://github.com/django/django/pull/7231。所以,除了等待补丁之外,没有任何答案适合这个问题。

答案 1 :(得分:0)

您必须从您的超类和您希望拥有的所有子类转储数据,并且要加载所有内容,首先加载超类,然后加载子类。

Django会自动为您做继承链接,因此您不必担心(您将看到超类和子类共享相同的pk)。

以下是一个例子:

# To export the data
$ python manage.py dumpdata app.Superclass > superclass.json
$ python manage.py dumpdata app.SubclassA app.SubclassB > subclasses.json


# To import the data
$ python manage.py loaddata superclass.json
$ python manage.py loaddata subclasses.json