#13834 closed (invalid)
Dumpdata/loaddata cycle fails when using a single-field natural key
Reported by: | Claude Paroz | Owned by: | nobody |
---|---|---|---|
Component: | Core (Serialization) | Version: | 1.2 |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Here is a sample model:
from django.db import models class OntologyManager(models.Manager): def get_by_natural_key(self, name): return self.get(name=name) class Ontology(models.Model): name = models.CharField(max_length=32, unique=True) objects = OntologyManager() def natural_key(self): return self.name class Term(models.Model): name = models.CharField(max_length=255) ontology = models.ForeignKey(Ontology)
Then create an ontology and a term linked to this ontology. Then run:
python manage.py dumpdata --natural --indent=1 > testdata.json python manage.py loaddata testdata.json
And the result:
Problem installing fixture 'testdata.json': Traceback (most recent call last): File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/loaddata.py", line 165, in handle for obj in objects: File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/json.py", line 38, in Deserializer for obj in PythonDeserializer(simplejson.load(stream), **options): File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/python.py", line 119, in Deserializer value = field.rel.to._meta.get_field(field.rel.field_name).to_python(field_value) File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/__init__.py", line 468, in to_python raise exceptions.ValidationError(self.error_messages['invalid']) ValidationError: [u'This value must be an integer.']
The bug is probably around the if hasattr(field_value, '__iter__'):
line in django/core/serializers/python.py (Deserializer function). If I manually add brackets around the Ontology name in the JSON file, the loaddata command succeeds.
Attachments (1)
Change History (3)
comment:1 by , 15 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 15 years ago
Argh... My bad!
But what about adding an assertion? This would help to catch the error sooner in the process.
by , 15 years ago
Attachment: | natural_key_assertion.diff added |
---|
Add an assertion about natural_key method return value type
Note:
See TracTickets
for help on using tickets.
Your
natural_key()
model method should always return a tuple, no special treatment is given to a natural key with one element:Reproduced the problem here with an your example code, then made that change and serializing/deserializing again worked flawlessly. From http://docs.djangoproject.com/en/dev/topics/serialization/#serialization-of-natural-keys: That method should always return a natural key tuple -- in this example, (first name, last name)
Closing this ticket.