启用自然键后,如何从Django的dumpdata产生的JSON中排除主键?

我构建了一条我想“导出”的记录,以便其他人可以通过将其加载到具有相同模式的单独数据库中而不会与同一模型中的其他记录冲突的方式,将其用作模板。

据我了解Django对自然键的支持,这似乎是NK旨在完成的工作。我的记录具有唯一的name字段,该字段也用作自然键。

因此,当我运行时:

from django.core import serializers
from myapp.models import MyModel
obj = MyModel.objects.get(id=123)
serializers.serialize('json', [obj], indent=4, use_natural_keys=True)

我希望输出类似:
[
    {
        "model": "myapp.mymodel",
        "fields": {
            "name": "foo",
            "create_date": "2011-09-22 12:00:00",
            "create_user": [
                "someusername"
            ]
        }
    }
]

然后我可以使用loaddata将其加载到另一个数据库中,并期望为它动态分配一个新的主键。请注意,我的“create_user”字段是Django的auth.User模型的FK,它支持自然键,并且将其输出为其自然键而不是整数主键。

但是,实际生成的是:
[
    {
        "pk": 123,
        "model": "myapp.mymodel",
        "fields": {
            "name": "foo",
            "create_date": "2011-09-22 12:00:00",
            "create_user": [
                "someusername"
            ]
        }
    }
]

这显然会与主键123冲突并覆盖任何现有记录。

解决此问题的最佳方法是什么?我不想将所有自动生成的主键整数字段追溯更改为等效的自然键,因为这会导致性能下降以及劳动强度大。

编辑:这似乎是a bugreported ... 2年前...,并在很大程度上被忽略了...

最佳答案

json的问题在于您不能忽略pk字段,因为在再次加载灯具数据时将需要它。如果不存在,json将失败并显示

$ python manage.py loaddata some_data.json
[...]
File ".../django/core/serializers/python.py", line 85, in Deserializer
data = {Model._meta.pk.attname : Model._meta.pk.to_python(d["pk"])}
KeyError: 'pk'

如对this question的回答所指出的,如果您确实要忽略yaml属性,或者仅将主键值替换为xml,则可以使用pknull
import re
from django.core import serializers

some_objects = MyClass.objects.all()
s = serializers.serialize('json', some_objects, use_natural_keys=True)
# Replace id values with null - adjust the regex to your needs
s = re.sub('"pk": [0-9]{1,5}', '"pk": null', s)

关于python - 使用自然键排除Django dumpdata中的主键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9436954/

10-11 07:18