Opened 8 months ago

Closed 8 months ago

Last modified 8 months ago

#29747 closed Bug (invalid)

UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).

Reported by: stockersky Owned by: nobody
Component: Database layer (models, ORM) Version: 2.1
Severity: Normal Keywords: uuid fixture loaddata OneToOne
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by stockersky)

Hello,

I was working on my django project with version 2.0.
Today I redeployed my development environment and installed the lastest Django version through pip : 2.1.1

While loading my database fixture to populate it (python manage.py loaddata data_fixture.json), it raised :

Traceback (most recent call last):
  File "/PROJECTS/SOFTWARES/pvenvs/cvdjango/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 2325, in to_python
    return uuid.UUID(value)
  File "/PROJECTS/SOFTWARES/python366/lib/python3.6/uuid.py", line 140, in __init__
    raise ValueError('badly formed hexadecimal UUID string')
ValueError: badly formed hexadecimal UUID string

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/PROJECTS/SOFTWARES/pvenvs/cvdjango/lib/python3.6/site-packages/django/core/serializers/python.py", line 100, in Deserializer
    data[Model._meta.pk.attname] = Model._meta.pk.to_python(d.get('pk'))
  File "/PROJECTS/SOFTWARES/pvenvs/cvdjango/lib/python3.6/site-packages/django/db/models/fields/related.py", line 874, in to_python
    return self.target_field.to_python(value)
  File "/PROJECTS/SOFTWARES/pvenvs/cvdjango/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 2330, in to_python
    params={'value': value},
django.core.exceptions.ValidationError: ["La valeur «\xa020\xa0» n'est pas un UUID valide."]

......................

 raise base.DeserializationError.WithData(e, d['model'], d.get('pk'), None)
django.core.serializers.base.DeserializationError: Problem installing fixture '/PROJECTS/CODE/cv_project/cv_frontend/fixtures/data_fixture.json': ["La valeur «\xa020\xa0» n'est pas un UUID valide."]: (cv_frontend.PersonalInfo:pk=20) field_value was 'None'

I flushed migrations, dropped/recreate database and ran migrations again. Still had the error...

I could actually still create an object having uuid as PK in the admin console and link other objects to it.

Then I began to delete objects in my fixture file and try to run again loaddata : when I deleted every fixture object that had OneToOne relationship, it passed!!!

I finally rolled back to Django 2.0 and could run the whole fixture with no problem!

Does it sound like a bug?

Change History (9)

comment:1 Changed 8 months ago by stockersky

Type: UncategorizedBug

comment:2 Changed 8 months ago by stockersky

Description: modified (diff)
Summary: Django 2.1.1 : UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).

comment:3 Changed 8 months ago by stockersky

Summary: UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).Django 2.1.1 : UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).

comment:4 Changed 8 months ago by Tim Graham

Do you have the value \xa020\xa0 in your fixtures? I'm not sure what that's supposed to be but it doesn't look like a valid UUID as the error message suggests.

comment:5 in reply to:  4 Changed 8 months ago by stockersky

No, I don't have anything like this in my fixture. I use valid UUID's
Actually, as I tried to use another UUID in my fixture, I noticed the value \xa020\xa0 was always in the message.


comment:6 Changed 8 months ago by Tim Graham

Can you provide a sample project that reproduces the problem?

comment:7 in reply to:  6 Changed 8 months ago by stockersky

models :

import uuid
from django.db import models

class MyClass1(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=20)

class MyClass2(models.Model):
    name = models.CharField(max_length=20)
    myclass1 = models.OneToOneField(MyClass1, on_delete=models.CASCADE, primary_key=True)

Fixture :

[
    {
        "model": "my_app.MyClass1",
        "pk": "7bc3c004-05d6-4d4d-a70b-cf0507320784",
        "fields": {
            "name": "blabla"
        }
    },
    {
        "model": "my_app.MyClass2",
        "pk": "20",
        "fields": {
            "name": "blibli",
            "myclass1": "7bc3c004-05d6-4d4d-a70b-cf0507320784"
        }
    }
]

comment:8 Changed 8 months ago by Tim Graham

Component: Testing frameworkDatabase layer (models, ORM)
Resolution: invalid
Status: newclosed
Summary: Django 2.1.1 : UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).UUID in loaddata fixture raise ValidationError on objects having OneToOne relationship (uuid as FK).

Bisected to e50add6ca1605dcc06c8c5a5770342779a4d5124, however, it looks like you have invalid fixture data. "pk": "20", should be a UUID since you have primary_key=True on the OneToOneField, shouldn't it?

comment:9 in reply to:  8 Changed 8 months ago by stockersky

Thanks for pointing out my mistake, Tim!
After fixing it, it works with Django 2.1.1.
Actually, maybe Django 2.0 was too permissive on the fixture because despite my error, it never raised an exception...
Notwithstanding, it didn't create those wrong pk fields on the database side.
My bad, I'm sorry for it.

Note: See TracTickets for help on using tickets.
Back to Top