How do you exclude the primary key from the JSON produced by Django’s dumpdata when natural keys are enabled?
I’ve constructed a record that I’d like to “export” so others can use it as a template, by loading it into a separate databases with the same schema without conflicting with other records in the same model.
As I understand Django’s support for natural keys, this seems like what NKs were designed to do. My record has a unique name field, which is also used as the natural key.
So when I run:
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)
I would expect an output something like:
[
{
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
which I could then load into another database, using loaddata, expecting it to be dynamically assigned a new primary key. Note, that my “create_user” field is a FK to Django’s auth.User model, which supports natural keys, and it output as its natural key instead of the integer primary key.
However, what’s generated is actually:
[
{
"pk": 123,
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
which will clearly conflict with and overwrite any existing record with primary key 123.
What’s the best way to fix this? I don’t want to retroactively change all the auto-generated primary key integer fields to whatever the equivalent natural keys are, since that would cause a performance hit as well as be labor intensive.
Edit: This seems to be a bug that was reported…2 years ago…and has largely been ignored…
The problem with
jsonis that you can’t omit thepkfield since it will be required upon loading of the fixture data again. If not existing, json will fail withAs pointed out in the answer to this question, you can use
yamlorxmlif you really want to omit thepkattribute OR just replace the primary key value withnull.