Django

2012-08-26 5 views
6

में उच्चतम मूल्य के ऑर्डरिंग फ़ील्ड +1 के डिफ़ॉल्ट मान को कैसे सेट करें अग्रिम में धन्यवाद। मैंने Django में एक मॉडल बनाया है, जिसमें इसका शीर्षक, यूआरएल और ऑर्डरिंग फील्ड है। अब मैंने उस ऑर्डरिंग फ़ील्ड का डिफ़ॉल्ट मान ZERO के रूप में सेट किया है। मेरी आवश्यकता यह है कि यह अपमान मूल्य current highest Ordering number + 1 में बदला जाना चाहिए। मैं व्यवस्थापक इंटीफेस में ऐसा कर सकता हूं?Django

class FooterLinks(models.Model): 
    title = models.CharField(_("Title"), max_length=200, null = True, blank = True) 
    link = models.CharField(_("Link"), max_length = 200) 
    order = models.IntegerField(_("Sort Order"), default=0) 
+0

आप [AutoField] के बारे में बात कर रहे हैं (https://docs.djangoproject.com/en/1.4/ref/ मॉडल/क्षेत्रों/# autofield)? – soon

+0

@soon हम इस प्रकार के प्रयोजनों के लिए ऑटोफिल्ड का उपयोग कर सकते हैं? वे प्राथमिक कुंजी के रूप में उपयोग किया जाता है, है ना? मेरा मतलब है ऑटोइनक्रिएटिंग के साथ एक अलग फ़ील्ड, लेकिन संपादन योग्य और एक अद्वितीय क्षेत्र नहीं होना चाहिए –

उत्तर

2
from django.db.models import Max 
new_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
FooterLinks.objects.filter(order=0).update(order=new_default) 

परिवर्तन को स्थायी बनाने के लिए, या तो दक्षिण के साथ एक डेटाबेस प्रवास ऐसा करने के लिए; या जैसा कि दानीप ने सहेजने के तरीके को ओवरराइड करने का सुझाव दिया था।

हालांकि ध्यान दें कि यदि आप तालिका बहुत बड़ी हो जाती है, तो यह तर्क आपके डेटाबेस पर ट्रिगर के रूप में कार्यान्वित करना बेहतर होगा।

संपादित करें:

नहीं, आप इस एक बार चलाने होगा और यह अपने डेटाबेस में सभी प्रविष्टियों को अपडेट होगा - आदर्श आप सामान्य प्रणाली डाउनटाइम/रखरखाव खिड़कियों के दौरान इस करना होगा।

टेक्स्ट बॉक्स में मान समायोजित करने के लिए, आपको अपने मॉडल में दिए गए डिफ़ॉल्ट को अपडेट करने की आवश्यकता है। ध्यान दें कि default एक मान या एक कॉल करने योग्य (दूसरे शब्दों में, एक विधि) ले सकता है। प्रत्येक बार क्षेत्र प्रदान किया जाता है विधि विधि कहा जाएगा।

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

+0

यह केवल एक प्रविष्टि सहेजने के बाद ही काम करेगा, है ना? मुझे व्यवस्थापक पैनल में एक नई प्रविष्टि जोड़ने के दौरान टेक्स्ट बॉक्स में बढ़े हुए मूल्य की आवश्यकता है? मैं उसे कैसे कर सकता हूँ? –

2

बुरहान के उत्तर से प्रेरित, मैं आपकी जैसी समस्या को हल करने में सक्षम था।

तो आपकी समस्या के लिए: मेरे models.py में प्रतिदेय get_new_default

from django.db.models import Max 

def get_new_default(): 
    new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
    return new_order_default 

class FooterLinks(models.Model): 
    order = models.CharField(_("Sort Order"), default = get_new_default) 

यह पाठ बॉक्स में नई अधिकतम आदेश मूल्य चिपकाता है और क्षेत्र संपादन योग्य रहता पैदा करते हैं।


--- !! संपादित करें !! ---

डेटाबेस को रीसेट करते समय यह एक समस्या उठाता है, क्योंकि अधिकतम गणना करने के लिए कोई ऑब्जेक्ट नहीं है। 1 को ठीक कर सभी पाया वस्तुओं और मामले से कोई भी में गिनती करने के लिए है सेट मौजूद डिफ़ॉल्ट:

from django.db.models import Max 

    def get_new_default(): 
     if FooterLinks.objects.all().count() == 0: 
      new_order_default = 1 
     else: 
      new_order_default = FooterLinks.objects.all().aggregate(Max('order'))['order__max']+1 
     return new_order_default 

    class FooterLinks(models.Model): 
     order = models.CharField(_("Sort Order"), default = get_new_default)