Opened 15 years ago
Closed 14 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 , 15 years ago
comment:2 by , 15 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 , 14 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 , 14 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.