Opened 14 years ago
Closed 13 years ago
#14438 closed Bug (duplicate)
Deserializer raises ValidationError if natural key is given as string
Reported by: | Piotr Czachur | Owned by: | nobody |
---|---|---|---|
Component: | Core (Serialization) | Version: | 1.2 |
Severity: | Normal | 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
Command manage.py dumpdata --natural --format=yaml
generates FK as following:
fk_name: natural_key_value
for example
color: red
Such fixture gives ValidationError when trying to load:
ValidationError: [u'This value must be an integer.']
The workaround for this problem is put natural key in []:
fk_name: [natural_key_value]
Change History (4)
comment:1 by , 14 years ago
comment:2 by , 14 years ago
Resolution: | → worksforme |
---|---|
Status: | new → closed |
I've tested this locally and the YAML generated is correct (see fixtures6 and fixures8 in Django's tests/modeltests/fixtures
test case, Visa has a FK to Person that has a one-field natural key).
- fields: permissions: - [add_user, auth, user] - [change_user, auth, user] - [delete_user, auth, user] person: [Django Reinhardt] model: fixtures.visa pk: 1 - fields: permissions: - [add_user, auth, user] person: [Stephane Grappelli] model: fixtures.visa pk: 2 - fields: permissions: [] person: [Prince] model: fixtures.visa pk: 3
I suspect the problem is the natural_key
method of the model your FK points to isn't returning a tuple. This is documented: http://docs.djangoproject.com/en/1.2/topics/serialization/#serialization-of-natural-keys
comment:3 by , 13 years ago
Easy pickings: | unset |
---|---|
Resolution: | worksforme |
Severity: | → Normal |
Status: | closed → reopened |
Type: | → Bug |
UI/UX: | unset |
Version: | SVN → 1.2 |
This is my very first post to Django bug system, so in case smth is incorrect please do not beat a newbie and let me know what's wrong in this bug submission form.
I am using Django 1.2.7.
When loading fixtures from json file I had the same issue.
First, I have loaded fixtures automatically by using syncdb. Got ValidationError.
Second, I manually deserialized json file and got the same ValidationError.
>>> f = open('/home/dima/djprojects/mysite/places/data/data_chunk.json', 'r') >>> for object in serializers.deserialize('json', f): ... print object ... <DeserializedObject: places.MenuCategory(pk=9)> <DeserializedObject: places.MenuCategory(pk=10)> Traceback (most recent call last): File "<console>", line 1, in <module> File "/usr/local/lib/python2.6/dist-packages/django/core/serializers/json.py", line 35, 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 471, in to_python raise exceptions.ValidationError(self.error_messages['invalid']) ValidationError: [u'This value must be an integer.']
I have verified that my natural_key() model method is returning a tuple, but this did not fix the bug.
class MenuCategoryManager(models.Manager): def get_by_natural_key(self, category): return self.get(category=category) class MenuCategory(models.Model): objects = MenuCategoryManager() category = models.CharField(max_length=256) # definition of natural keys def natural_key(self): return (self.category,)
Only when I added [] to the value in json file (where key was referring to the ForeignKey relationship) the Error resolved.
So, I was get ValidationError with this json
"menu_category": "Холодные закуски и салаты",
And no ValidationError with this json
"menu_category": [ "Холодные закуски и салаты" ],
comment:4 by , 13 years ago
Resolution: | → duplicate |
---|---|
Status: | reopened → closed |
The problem you're running into is that your natural key is not in a "tuple". This is the same root cause of the problem in #16208. I'm closing this one duplicate & posting fix there.
and in case of m2m relation, in yaml you have to use:
because:
will also fail with similar ValidationError.