2013-01-09 6 views
20

मुझे अपने मॉडल में से एक में समस्या है। मैं एक छवि अपलोड कर रहा हूं, और मैं आईडी (डेटाबेस तालिका में पीके) को स्टोर करना चाहता हूं लेकिन मुझे पता होना चाहिए कि किस बिंदु पर Django को self.id तक पहुंच होगी।Django - एक नई वस्तु को सहेजते समय self.id कैसे प्राप्त करें?

models.py

class BicycleAdItemKind(MPTTModel): 
    def url(self, filename): 
     pdb.set_trace() 

     url = "MultimediaData/HelpAdImages/ItemKind/%s/%s" % (self.id, filename) 
     return url 

    def item_kind_image(self): 
     return '<img align="middle" src="/media/%s" height="60px" />' % self.image 
    item_kind_image.allow_tags = True  

    # Bicicleta completa, Componentes para bicicleta, Acessorios para ciclista 
    n_item_kind  = models.CharField(max_length=50) 
    parent   = TreeForeignKey('self', null=True, 
             blank=True, related_name='children') 
    description  = models.TextField(null=True, blank=True) 
    image   = models.ImageField(upload_to=url, null=True, blank=True) 
    date_inserted = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 

    def __unicode__(self): 
     return self.n_item_kind 

    class MPTTMeta: 
     order_insertion_by = ['n_item_kind'] 

समस्या url() विधि में है; ऑब्जेक्ट को अपडेट करते समय मुझे केवल self.id मिल सकता है, मुझे कोई नई ऑब्जेक्ट बनाते समय self.id नहीं मिलता है। मैं इस मॉडल को कैसे संशोधित कर सकता हूं ताकि मुझे कोई नई वस्तु बनाते समय self.id मिल सके?

वर्तमान कोड के साथ

, जब मैं एक नई वस्तु बना रहा हूं मैं की तरह एक यूआरएल के साथ खत्म हो जाएगा:

MultimediaData/HelpAdImages/ItemKind/None/somefile.jpg 

और मैं कुछ तरह की आवश्यकता है:

MultimediaData/HelpAdImages/ItemKind/35/somefile.jpg 

कोई सुराग ?

+0

क्या आप 'url()' फ़ंक्शन का उपयोग कहां से उजागर कर सकते हैं? – tushar747

+0

इसका उपयोग क्षेत्र छवि में किया जाता है, "image = models.ImageField (upload_to = url, null = true, blank = True)"। जब छवि अपलोड की जा रही है तो विधि सक्रिय है। –

उत्तर

22

यदि यह एक नई वस्तु है, तो आप यह पहली बार बचाने के लिए और फिर self.id का उपयोग, क्योंकि

"There's no way to tell what the value of an ID will be before you call save(), 
because that value is calculated by your database, not by Django." 

चेक Django के दस्तावेज़ https://docs.djangoproject.com/en/dev/ref/models/instances/

+0

हाय! आपके जवाब के लिए धन्यवाद। सहेजने के अंदर छवि को अपलोड करने के बारे में कोई विचार) विधि? बेस्ट विनर्ड्स, –

+3

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

+0

@QiangJin आप इसे दो बार बचाने का क्या मतलब है? इसे बचाओ, आईडी तक पहुंचें। मैं अभी भी ऐसा नहीं कर सकता।क्या आप कुछ उदाहरण कोड पोस्ट कर सकते हैं PLEASSEE –

4

आपको यह फ़ाइल/उदाहरण दो बार बचाने के लिए आवश्यकता हो सकती है की जरूरत है:

आप मॉडल पर पोस्ट_सेव सिग्नल का उपयोग कर सकते हैं जो बनाए गए ध्वज की तलाश में है, और यूआरएल अपडेट करने और उदाहरण के रूप में फ़ाइल को फिर से नामित करने के उदाहरण को फिर से सहेजता है), क्योंकि उदाहरण में अब एक आईडी होगी। सुनिश्चित करें कि आप केवल इस पर सशर्त बनाये गये हैं, अन्यथा, आप लगातार सहेजने में लूप करेंगे: सहेजने के बाद एक सेव सिग्नल बंद हो जाता है, जो एक सहेजने वाला सिग्नल बंद करता है ...

देखें https://docs.djangoproject.com/en/dev/ref/signals/#post-save

-3

मुझे पता है कि यह एक पुराना है लेकिन मैंने सोचा कि यह किसी के लिए उपयोग का हो सकता है, ऐसा लगता है कि अभी तक ठीक काम करता है।

Views.py

#Queries model and appends id's to list 
    try: 
     qs = YourModel.objects.all() 
     qslist = [] 

     for item in qs: 
      qslist.append(item.id) 

     newid = int(max(qslist) + 1) 
    #If no entries are found, assume this is the first entry. 
    except: 
     newid = 1 

हालांकि, मैं यकीन नहीं है कि यह कैसे अच्छी तरह से बड़े डीबीएस पर प्रदर्शन करेंगे।

+2

यह कोड खतरनाक है और इसका उपयोग नहीं किया जाना चाहिए। बहु-उपयोगकर्ता वातावरण में कोई तरीका नहीं है कि आप गारंटी दे सकते हैं कि जब तक आप डेटाबेस में पंक्ति डालेंगे तब तक कोई आईडी नहीं होगी। यदि दो उपयोगकर्ता सहेजने से पहले इस कोड को निष्पादित करना समाप्त कर देते हैं तो आप डुप्लिकेट प्राथमिक कुंजी और एक डालने _will_ विफल होने के साथ समाप्त हो जाएंगे। – Tony

-3
q = Order.objects.values_list('id', flat=True).order_by('-id')[:1] 
      if len(q): 
       self.number = str(self.id) if self.id else str(int(q.get()) + 1) 
      else: 
       self.number = 1 
+2

यह कोड खतरनाक है और इसका उपयोग नहीं किया जाना चाहिए। बहु-उपयोगकर्ता वातावरण में कोई तरीका नहीं है कि आप गारंटी दे सकते हैं कि जब तक आप डेटाबेस में पंक्ति डालेंगे तब तक कोई आईडी नहीं होगी। यदि दो उपयोगकर्ता सहेजने से पहले इस कोड को निष्पादित करना समाप्त कर देते हैं तो आप डुप्लिकेट प्राथमिक कुंजी के साथ समाप्त हो जाएंगे और एक सम्मिलन विफल हो जाएगा। – Tony

+0

यह आईडी प्राप्त करने के रास्ते पर है, सवाल यह है कि "स्वयं आईडी कैसे प्राप्त करें"। तो यदि समाधान काम करता है और इसका उपयोग किया जा सकता है - इसका मतलब है कि यह समाधान समाधान है। इसका उपयोग करने के लिए या नहीं - प्रत्येक डेवलपर तक! – mexekanez

+0

सिर्फ इसलिए कि यह विधि किसी उपयोगकर्ता के साथ विकास वातावरण में काम करती है ** ** ** का मतलब यह नहीं है कि यह एक वैध समाधान है। मैं इस कोड को कई उपयोगकर्ताओं के साथ उत्पादन सर्वर पर नहीं डालूंगा। यह किसी बिंदु पर असफल होने जा रहा है। – Tony

1

ध्यान दें: आप अन्यथा डेटाबेस एक नया आईडी के साथ अद्यतन किया जाएगा, models.AutoField(primary_key=True) विशेषता सेट की आवश्यकता है लेकिन Django इसे पहचान नहीं होगा।

models.AutoField(primary_key=True) 
संबंधित मुद्दे