2013-06-04 11 views
23

मैं मॉडल क्षेत्र से django में प्रति अनुरोध अलग/अद्वितीय आईडी उत्पन्न करना चाहता हूं। मैंने ऐसा किया लेकिन मैं एक ही आईडी प्राप्त कर रहा हूं।मॉडल क्षेत्र से django में अद्वितीय आईडी उत्पन्न करें

class Paid(models.Model): 
    user=models.ForeignKey(User) 
    eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True, default=uuid.uuid4()) #want to generate new unique id from this field 

    def __unicode__(self): 
     return self.user 

उत्तर

35

अद्यतन: आप Django 1.8 या बेहतर उपयोग कर रहे हैं, @madzohan नीचे सही जवाब है।


इसे इस तरह कार्य करें:

#note the uuid without parenthesis 
eyw_transactionref=models.CharField(max_length=100, blank=True, unique=True, default=uuid.uuid4) 

कारण है कि क्योंकि कोष्ठक के साथ आप समारोह का मूल्यांकन किया जाता है जब मॉडल आयात किया जाता है और यह एक UUID जो हर लिए इस्तेमाल किया जाएगा निकलेगा उदाहरण बनाया गया।

ब्रांड्स के बिना आप केवल फ़ील्ड को डिफ़ॉल्ट मान देने के लिए बुलाए जाने वाले फ़ंक्शन को पारित करते हैं और प्रत्येक बार मॉडल आयात होने पर इसे कॉल किया जाएगा।

आप भी इस दृष्टिकोण ले जा सकते हैं:

class Paid(models.Model): 
    user=models.ForeignKey(User) 
    eyw_transactionref=models.CharField(max_length=100, null=True, blank=True, unique=True) 

    def __init__(self): 
     super(Paid, self).__init__() 
     self.eyw_transactionref = str(uuid.uuid4()) 

    def __unicode__(self): 
     return self.user 

आशा इस मदद करता है! अपने उत्पन्न प्रवास फाइल करने के लिए

from uuid import UUID

:

+0

मैं that..I'm अब मेरी DB में शून्य हो रही किया था, यह यह बचत नहीं कर रहा है इसका मतलब है! क्या मुझे अपना विचार पोस्ट करना चाहिए? – picomon

+1

यदि आपके पास डिफ़ॉल्ट मान है तो आपको फ़ील्ड परिभाषा में 'null = True' की आवश्यकता नहीं होगी। मैं जवाब से हटा दूंगा। इसके बिना कोशिश करो। –

+0

अब यह त्रुटि प्राप्त करना/वेतन/ (1048, "कॉलम 'eyw_transactionref' शून्य नहीं हो सकता है") मैंने खाली = सही भी हटा दिया। – picomon

58

के बाद से संस्करण 1.8 Django UUIDField https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.UUIDField

import uuid 
from django.db import models 

class MyUUIDModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    # other fields 
+8

यदि आपके पास Django1.8 + :) –

+0

है तो आपको वास्तविक जवाब भी है, क्या आपको 'अद्वितीय = True' की भी आवश्यकता है? – Sevenearths

+0

@ सेवनवेर्थ http://stackoverflow.com/questions/31499836/does-djangos-new-uuidfields-default-attribute-take-care-of-theununeness – madzohan

8

है आप की जरूरत है या एक कस्टम आईडी पैदा समारोह के बजाय Django के UUID क्षेत्र का उपयोग करना चाहते हैं, तो आप save() विधि में थोड़ी देर के पाश का उपयोग कर सकते हैं। पर्याप्त रूप से बड़े अद्वितीय आईडी के लिए, यह एक एकल डाटाबेस कॉल की तुलना में अधिक में परिणाम लगभग कभी नहीं होगा विशिष्टता सत्यापित करने के लिए:

urlhash = models.CharField(max_length=6, null=True, blank=True, unique=True) 

# Sample of an ID generator - could be any string/number generator 
# For a 6-char field, this one yields 2.1 billion unique IDs 
def id_generator(size=6, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(chars) for _ in range(size)) 

def save(self): 
    if not self.urlhash: 
     # Generate ID once, then check the db. If exists, keep trying. 
     self.urlhash = id_generator() 
     while MyModel.objects.filter(urlhash=self.urlhash).exists(): 
      self.urlhash = id_generator() 
    super(MyModel, self).save() 
संबंधित मुद्दे