python - Validation on ManyToManyField before Save in Models.py -


मेरे पास निम्न मॉडल हैं:

  class अनुप्रयोग (models.Model): users = Models.ManyToManyField (उपयोगकर्ता, = 'अनुमति' के माध्यम से) फ़ोल्डर = मॉडल। फ़्रीइन्ग्ज (फ़ोल्डर) वर्ग फ़ोल्डर (मॉडल.मॉडेल): कंपनी = मॉडल। बहु-मानकीफिल्ड (कम्पनी) वर्ग UserProfile (models.Model): user = models.OneToOneField उपयोगकर्ता, संबंधित_नाम = 'प्रोफाइल') कंपनी = मॉडल। बहु-मानकीफिल्ड (कंपनी)  

मैं क्या करना चाहूंगा यह देखने के लिए कि आवेदन के उपयोगकर्ताओं में से कोई एक ही कंपनी है एप्लिकेशन (फ़ोल्डर के माध्यम से) यदि यह मामला है तो आवेदन उदाहरण को सहेजा नहीं जाना चाहिए।

समस्या यह है कि कई टाईमैनीफिल्ड 'पोस्ट-सेव' सिग्नल के बाद तक अपडेट नहीं किए जाते हैं।
एकमात्र विकल्प नया m2m_changed संकेत हो रहा है लेकिन मुझे यकीन नहीं है कि मैं पहले से ही बचाए गए सहेजे को वापस कैसे रोल करूंगा।
एक अन्य विकल्प सहेजने के फ़ंक्शन को फिर से लिखना होगा (models.py में, क्योंकि मैं यहां व्यवस्थापक के बारे में बात कर रहा हूं), लेकिन मैं 'मुझे यकीन नहीं है कि मैं कितने टेटमैनीफील्ड सामग्री का उपयोग कर सकता हूं।
अंत में मैंने admin.py में मॉडल के व्यवस्थापक में सहेजें फ़ंक्शन को फिर से लिखने के बारे में कुछ पढ़ा है, हालांकि मुझे अब भी पता नहीं होगा कि आप कई लोग इस विषय की तलाश कर रहे हैं लेकिन मुझे कुछ भी नहीं मिला, मेरे लिए काम करने लगता है।
अगर कुछ भी स्पष्ट नहीं है, तो कृपया मुझे बताएं।

धन्यवाद आपकी मदद!
बुलडोस से मुझे कोई जवाब नहीं मिला क्योंकि मैंने फैसला किया है कि < में एक नया प्रश्न पूछें और अंत में जमेज़ से जवाब मिला।

मुझे लगा कि बोटोंडस विधि यह करने का सही तरीका था, यह अभी काफी काम नहीं कर रहा था। कारण यह कि इस मामले में काम नहीं करता है, क्योंकि मैं मैदान के माध्यम से एक मॉडल का उपयोग कर रहा हूं, मैं इस पर सत्यापन करना चाहता हूं। कुछ पहले अभिपुष्टि के कारण मुझे एक पहले पोस्ट किए गए प्रश्न पर मिला जो मैंने पहले इकट्ठा किया था कि पहले आवेदन उदाहरण बचाया जाता है और फिर कई सारे उदाहरण सहेजे जाते हैं (मेरा मानना ​​है कि यह सही है, लेकिन अगर मुझे गलत है तो मुझे सही)। इसलिए मैंने सोचा कि, अगर मैं मॉडल के माध्यम से कई सारे क्षेत्र पर मान्यता प्राप्त करेगा, तो यह अनुप्रयोग उदाहरण को सहेजने से रोक नहीं सकता है। लेकिन वास्तव में यह ऐसा होने से रोकता है

इसलिए यदि आपके मॉडल के व्यवस्थापक में कई सारे फ़ील्ड इनलाइन हैं और आप उस फ़ील्ड पर सत्यापन करना चाहते हैं, तो आप मॉडल के माध्यम से साफ फ़ंक्शन को इस तरह निर्दिष्ट करते हैं:

  admin.py वर्ग अनुमतिइनलाइन (admin.TabularInline): फार्म = अनुमति प्रारूप मॉडल = अनुमति अतिरिक्त = 3 forms.py वर्ग अनुमति फ़ार्म (forms.ModelForm): कक्षा मेटा: मॉडल = अनुमति def साफ (स्वयं): cleaned_data = self Cleaned_data user = cleaned_data ['user'] role = cleaned_data ['role'] अगर role.id! = 1: folder = cleaned_data ['application']। फ़ोल्डर अगर len (filter (lambda x: x in user.profile.company) .all (), folder.company.all ())) & gt; 0: # यह एक प्रतिच्छेदन रूप है। मान्यकरण त्रुटि ("इस एप्लिकेशन के उपयोगकर्ताओं में से एक को एक रिपोजिटरी के संगठनों के लिए काम करता है!") रिटर्न क्लीनएडेटा  

यदि सत्यापन में कोई त्रुटि होती है कुछ भी नहीं (आवेदन का उदाहरण, और न ही कई लोग उपयोगकर्ता उदाहरण) सहेजे गए हैं और आपको त्रुटि को ठीक करने का मौका मिलता है।


Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -