2009-06-30 13 views
6

के संबंध में डीजेगो में ऑटो का मूल्य बढ़ाना पिछले एक के संबंध में एक क्षेत्र को ऑटोइनक्रिकेट करने का कोई तरीका है ... उदाहरण के लिए यदि पिछले रिकॉर्ड में मूल्य 09-0001 है, तो अगला रिकॉर्ड होना चाहिए असाइन किया गया 09-0002 और इतना ... विचार? मैं सहेजने की विधि को ओवरराइड करने के बारे में सोच रहा हूं, लेकिन वास्तव में मुझे कितना यकीन नहीं हैपिछले एक

उत्तर

8

Django आपको मॉडल में एक से अधिक ऑटोफिल्ड नहीं होने देगा, और आपके पास पहले से ही आपकी प्राथमिक कुंजी के लिए एक है। तो आपको बचत को ओवरराइड करना होगा और बढ़ने के बारे में जानने के लिए शायद तालिका में वापस देखने की आवश्यकता होगी।

कुछ इस तरह:

class Product(models.Model): 
    code = models.IntegerField() 
    number = models.IntegerField() 
    ... 

    def get_serial_number(self): 
     "Get formatted value of serial number" 
     return "%.2d-%.3d" % (self.code, self.product) 

    def save(self): 
     "Get last value of Code and Number from database, and increment before save" 
     top = Product.objects.order_by('-code','-number')[0] 
     self.code = top.code + 1 
     self.number = top.number + 1 
     super(Product, self).save() 

    # etc. 

ध्यान रखें कि आपके बचाने विधि में ताला लगा किसी तरह का बिना, आप एक संगामिति समस्या में (दो धागे कोड और संख्या में एक ही मान संग्रहीत करने का प्रयास) चला सकते हैं।

+3

समवर्ती समस्याओं को ठीक करने के लिए आप 'top = product.objects.select_for_update (nowait = True) का उपयोग कर सकते हैं .order_by ('- code', '- number') [0]' –

+0

हां, 'select_for_update()' का उपयोग करें, लेकिन सुनिश्चित करें कि आपका आरडीबीएमएस पहले पंक्ति लॉकिंग का समर्थन करता है! (हाल ही में MySQL और Postgres करते हैं)। – Seth

1

ऑटोफ़ील्ड फ़ील्ड प्रकार है जो Django मॉडल बेस क्लास 'आईडी' प्रॉपर्टी के लिए उपयोग करता है, लेकिन आप इसे अतिरिक्त ऑटोइनक्रिकमेंट के लिए उपयोग कर सकते हैं खेत।

मुझे नहीं लगता कि आप अपने उदाहरण में किसी भी प्रारूपण कर सकते हैं, लेकिन एक अच्छा तरीका कस्टम फ़ील्ड प्रकार बनाना होगा जो इच्छित स्वरूपण करने के लिए सेव() विधि को ओवरराइड करता है।

+0

मैं देखता हूं कि मैं यह कर सकता हूं ... मैंने सोचा था कि उस क्षेत्र के पिछले रिकॉर्ड के मूल्य को पुनः प्राप्त करने जैसे कुछ आसान तरीका था, फिर इसमें 1 जोड़ना। वैसे भी धन्यवाद –

0
एसक्यूएल में

:

+-------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+-------+------------------+------+-----+---------+----------------+ 
| code | int(11) unsigned | NO | PRI | NULL | auto_increment | 
+-------+------------------+------+-----+---------+----------------+ 

Django में:

self.code = None 
self.number = top.number + 1 
self.save() # or super(Product, self).save() 

जब बचाया, code स्वचालित रूप से बढ़ जाएगी।

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