web-dev-qa-db-fra.com

L'UUID ('...') n'est pas sérialisable JSON

J'obtiens cette erreur lorsque j'essaie de passer l'attribut UUID au paramètre url.

urlpatterns = [
    url(r'^historia-clinica/(?P<uuid>[W\d\-]+)/$', ClinicHistoryDetail.as_view(), name='...'),
]

views.py

class ClinicHistoryDetail(...):
     ...
     my_object = MyModel.objects.create(...)
     ...
     return redirect(reverse('namespace:name', kwargs={'uuid' : my_object.id}))

model.py

class MyModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ...

Aucune suggestion?

19
DJeanCar

Il y a un ticket de bogue sur Django concernant ce problème, cependant un soi-disant 'encodeur complexe' personnalisé par python les documents peuvent vous aider).

import json
from uuid import UUID


class UUIDEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, UUID):
            # if the obj is uuid, we simply return the value of uuid
            return obj.hex
        return json.JSONEncoder.default(self, obj)

Maintenant, si nous faisions quelque chose comme ça

json.dumps(my_object, cls=UUIDEncoder)

Votre champ uuid doit être encodé.

24
IVI

Pour utiliser l'UUID dans une URL comme celle-ci, vous devez le passer sous forme de chaîne:

 return redirect(reverse('namespace:name', kwargs={'uuid' : str(object.id)}))

FYI - il semble que la réponse de WIM soit un peu plus approfondie. Votre regex devrait certainement être resserré. Si vous finissez par utiliser la représentation sous forme de chaîne du slug, vous aurez besoin d'une expression régulière comme celle-ci: [A-Za-z0-9\-]+ qui permet les caractères alphanumériques et les tirets.

1
Jordan Haines