2010-02-25 15 views
5

में कई रिश्ते के लिए कई लोगों का प्रतिनिधित्व करने का बेहतर तरीका मुझे django व्यवस्थापक में जिस तरह से संभाला जाना चाहिए, उसमें एक अनूठी समस्या है।django admin

मैं मॉडल संरचना निम्नलिखित है ...

class Product(models.Model): 
    name = models.CharField(max_length = 100) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2) 


    def __unicode__(self): 
     return self.name 


class Country(models.Model): 
    name = models.CharField(max_length = 2) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2)  

    def __unicode__(self): 
     return self.name 


class CountryProduct(models.Model): 
    country = models.ForeignKey(Country) 
    product = models.ForeignKey(Product) 
    overriden_price = models.DecimalField(max_digits = 5, decimal_places = 2) 

    class Meta: 
     unique_together = (("country", "product"),) 

यहाँ दिखाया गया है के रूप में वहाँ उत्पादों और देशों के बीच कई संबंध बनाने के लिए कई है .... मैं भी देश के लिए अधिभावी आधार मूल्य के लिए व्यवस्थापक इंटरफ़ेस प्रदान करना चाहते हैं और उत्पाद।

निम्नानुसार ui रखने का एक विकल्प, यहां डैश (-) डिफ़ॉल्ट मूल्य का प्रतिनिधित्व करता है और संख्या में मूल्य दिया गया देश और उत्पाद के लिए ओवरराइड मूल्य का प्रतिनिधित्व करता है।

countries -> | US | UK 
products  |  | 
--------------------------- 
Product1  | - | 10 
Product2  | 5 | 7 

लेकिन मुझे लगता है कि ऐसा करने के लिए पता नहीं कैसे ....

मैं वैकल्पिक तरीकों (मॉडल संरचना में परिवर्तन सहित) को देखने के लिए खुला है और साथ ही लंबे समय से कर रहा हूँ के रूप में यह आवश्यकता को पूरा करती। .. किसी भी तरह की आपका इनपुट निश्चित रूप से अग्रिम में मेरे लिए उपयोगी हो जाएगा ...

धन्यवाद :)

उत्तर

2

मैं गया समाधान, यहाँ मेरे सवाल का मेरा उत्तर मैं निम्नलिखित तरीके से मॉडल बदल रहा है ... मुझे इसे आपके साथ साझा करते हैं ... ....

class Product(models.Model): 
    name = models.CharField(max_length = 100) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2) 


    def __unicode__(self): 
     return self.name 


class Country(models.Model): 
    name = models.CharField(max_length = 2) 
    base_price = models.DecimalField(max_digits = 5, decimal_places = 2)  
    products = models.ManyToManyField(Product, through = 'CountryProduct') 

    def __unicode__(self): 
     return self.name 


class CountryProduct(models.Model): 
    country = models.ForeignKey(Country) 
    product = models.ForeignKey(Product) 
    overriden_price = models.DecimalField(max_digits = 5, decimal_places = 2) 

    class Meta: 
     unique_together = (("country", "product"),) 


class CountryProductInline(admin.TabularInline): 
    model = CountryProduct 

class CountryAdmin(admin.ModelAdmin): 
    inlines = [CountryProductInline] 

class ProductAdmin(admin.ModelAdmin): 
    inlines = [CountryProductInline] 

हालांकि यह मेरी अपेक्षा नहीं है, यह मुझे बेहतर समाधान देता है ....

0

कोई रास्ता नहीं में निर्मित Django व्यवस्थापक करने के लिए आप क्या जरूरत है ऐसा करने के लिए नहीं है।

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

0

यह - संभावित रूप से - एक भयानक डिज़ाइन है। आपकी डेटाबेस तालिका में सही मूल्य होना चाहिए।

आपका आवेदन अब दो चीजें करना चाहिए। इसे कहीं और से डिफ़ॉल्ट कीमत मिलनी चाहिए (इस तालिका में नहीं) और इसे ओवरराइड मूल्य (इस तालिका से) भी प्राप्त करना होगा और दो टुकड़ों को एक साथ रखना होगा।

आप छोटे पैमाने पर काम कर रहे ग्रिड के साथ SQL कार्य नहीं कर सकते हैं।

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

ग्रिड बनाने के लिए आपको अपने सभी देशों और उत्पादों को प्राप्त करना होगा। इसके बाद आपको उपयुक्त सूची-सूची सूचीबद्ध करनी होगी। फिर आप इसे प्रदर्शित करने के लिए अपना खुद का टेम्पलेट लिख सकते हैं। आपके पास 12 से अधिक देशों के बाद, ग्रिड इतनी व्यापक होगी कि लगभग बेकार हो। लेकिन पहले कुछ देशों के लिए आप यह काम कर सकते हैं।

आपको ऐसा करने के लिए अपना स्वयं का टेम्प्लेट और अपना स्वयं का दृश्य फ़ंक्शन बनाना होगा।

संपादित

कौनसी आवश्यकता "मैं जब तक कि यह आवश्यकता को पूरा करती रूप में वैकल्पिक तरीकों (मॉडल संरचना में परिवर्तन सहित) को देखने के लिए खुला के रूप में अच्छी तरह से कर रहा हूँ?" खराब डिजाइन जहां कीमत खोजने के लिए दो प्रश्न पूछते हैं? क्या यह आवश्यक है?

या बहुत मुश्किल ग्रिड लेआउट? क्या यह आवश्यक है?

यह स्पष्ट नहीं है कि "आवश्यकता" क्या है, इसलिए किसी भी विकल्प का प्रस्ताव देना संभव नहीं है। यह कहना संभव है कि

  1. एक एसक्यूएल डिज़ाइन जो बेस से पूछताछ करता है और अलग-अलग ओवरराइड करता है वह धीमा और अधिक जटिल होगा।

  2. एक एसक्यूएल डिज़ाइन जिसमें एक एकल मान है जो "गतिशील डिफ़ॉल्ट" से लोड होता है और उपयोगकर्ता द्वारा बदला जा सकता है (या नहीं) बहुत आसान है। यह initial तर्क के साथ किया जा सकता है। http://docs.djangoproject.com/en/dev/ref/forms/fields/#initial

  3. एसक्यूएल आसानी से कई पंक्तियों को ग्रिड जैसी संरचना में बदल नहीं सकता है। इसके लिए एक परिष्कृत एसक्यूएल (ओआरएम की क्षमता के बाहर अच्छी तरह से) या एक दृश्य समारोह में पायथन प्रोसेसिंग की आवश्यकता होती है।

  4. Django व्यवस्थापक ग्रिड जैसी संरचनाओं को बिल्कुल नहीं करेगा।

+0

यह एक पूर्ण डिज़ाइन नहीं है, सिर्फ प्रश्न को सरल बनाना चाहता था और यही कारण है कि इस तरह से प्रतिनिधित्व किया गया .... और आप सही हैं इस तरह से ग्रिड पेश करना एक अच्छा विचार नहीं है, लेकिन यह मेरे पास सिर्फ एक विकल्प था ... –

+0

क्या आप विस्तृत कर सकते हैं आइटम 2 पर: गतिशील डिफ़ॉल्ट? "ओवरराइड" का यह प्रश्न कुछ ऐसा है जो मैंने अपने आप में चलाया है और कभी भी सहज कार्यान्वयन महसूस नहीं किया है। क्या कोई लेख है जो इस मुद्दे का पता लगाता है ('sql overrides' letmegooglethatforyou के लिए बहुत सामान्य है)। – Koobz

+0

"डायनामिक डिफॉल्ट" केवल एक डिफ़ॉल्ट मान है जो मॉडल में स्थिर रूप से परिभाषित नहीं है लेकिन वर्तमान डेटा, लेनदेन स्थिति या कुछ और के आधार पर गतिशील रूप से लोड किया गया है। यह सिर्फ एक डिफ़ॉल्ट मान है जो गतिशील रूप से रन-टाइम पर फ़ॉर्म में लोड किया जाता है। इसे पढ़ें: http://docs.djangoproject.com/en/dev/ref/forms/fields/#initial –