2016-04-13 20 views
5

Viene visualizzato questo errore quando tento di passare l'attributo UUID al parametro url.UUID ('...') non serializzabile JSON

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) 
    ... 

Qualsiasi suggerire?

+0

Sarebbe meglio se potessi mostrarci come lo hai passato e anche cosa sta facendo 'ClinicHistoryDetail'. – ozgur

risposta

0

Per utilizzare l'UUID in un URL del genere, si dovrebbe passare come una stringa:

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

CRONACA - sembra WIM risposta è un po 'più approfondita. Il tuo regex dovrebbe certamente essere rafforzato. Se si finisce per usare la rappresentazione di stringa dello slug, si vorrà un'espressione regolare come questa: [A-Za-z0-9\-]+ che consente di caratteri alfanumerici e trattini.

+0

Probabilmente stai ancora ricevendo il tuo errore perché né l'UUID né l'esadecimale sono oggetti serializzabili. Dovresti renderli una stringa nel tuo dizionario di kwargs 'str (object.id)' o 'str (object.id.hex)' Quindi assicurati che la tua espressione regolare corrisponda all'opzione scelta. Se è esadecimale, usa '[0-9a-f] {32}'. Altrimenti, usa '[A-Za-z0-9 \ -] +' –

0

Nella linea di reindirizzamento, modificare il kwargs da:

kwargs={'uuid' : object.id} 

A tal

kwargs={'uuid' : object.id.hex} 

e quindi utilizzare una regex migliore nel URLPATTERN:

r'[0-9a-f]{32}' 
+0

Ho ancora l'errore – DJeanCar

3

C'è una bug ticket su Django riguardo a questo problema, tuttavia un cosiddetto "encoder complesso" personalizzato tramite i documenti python può aiutarti.

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) 

Ora, se abbiamo fatto qualcosa di simile

json.dumps(my_object, cls=UUIDEncoder) 

vostro campo UUID dovrebbe essere codificato.

Problemi correlati