2016-04-13 9 views
5

नहीं है जब मैं url पैरामीटर में UUID विशेषता को पास करने का प्रयास करता हूं तो मुझे यह त्रुटि मिलती है।यूयूआईडी ('...') JSON serializable

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

किसी भी सुझाव है?

+0

यह बेहतर होगा अगर आप हमें दिखा सकें कि आपने इसे कैसे पारित किया है और यह भी कि 'क्लिनिक हिस्ट्री डेंटल' क्या कर रहा है। – ozgur

उत्तर

0

कि एक ऐसा URL में UUID का उपयोग कर के लिए, आप यह एक स्ट्रिंग के रूप पारित करना चाहिए:

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

FYI करें - ऐसा लगता है WIMs उत्तर की तरह थोड़ा और पूरी तरह से है। आपका regex निश्चित रूप से कड़ा होना चाहिए। यदि आप स्लग के स्ट्रिंग प्रस्तुति का उपयोग करते हैं, तो आप इस तरह एक रेगेक्स चाहते हैं: [A-Za-z0-9\-]+ जो अल्फान्यूमेरिक्स और हाइफ़न के लिए अनुमति देता है।

+0

आपको शायद अभी भी आपकी त्रुटि मिल रही है क्योंकि न तो यूयूआईडी या हेक्स एक धारावाहिक वस्तु है। आपको उन्हें अपने kwargs शब्दकोश 'str (object.id)' या 'str (object.id.hex)' में एक स्ट्रिंग बनाना चाहिए, फिर बस यह सुनिश्चित करें कि आपका रेगेक्स आपके द्वारा चुने गए विकल्प से मेल खाता है। यदि यह हेक्स है, तो '[0-9a-f] {32} 'का उपयोग करें। अन्यथा, '[ए-ज़ा-जे 0-9 \ -] + ' –

0

रीडायरेक्ट लाइन में, बदल kwargs से:

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

का उपयोग करें मुझे अभी भी त्रुटि है – DJeanCar

3

वहाँ एक है:

kwargs={'uuid' : object.id} 

इस

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

और फिर करने के लिए URLPATTERN में एक बेहतर regex का उपयोग इस मुद्दे के बारे में Django पर बग टिकट हालांकि पाइथन दस्तावेज़ द्वारा एक कस्टम तथाकथित 'जटिल एन्कोडर' आपको मदद कर सकता है।

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) 

अब अगर हम इस

json.dumps(my_object, cls=UUIDEncoder) 

की तरह कुछ किया आपका UUID क्षेत्र इनकोडिंग किया जाना चाहिए।

संबंधित मुद्दे