मेरे पास एक ही मॉडल के कुछ डीआरएफ धारावाहिक वर्ग हैं। मैं कोड पुनरावृत्ति से बचने के लिए कक्षा निर्माण कोड को फ़ंक्शन में ले जाना चाहता हूं।

तो मूल रूप से मुझे एक समारोह से कक्षा वापस करनी है, लेकिन मैं कक्षा के अंदर फ़ंक्शन पैरामीटर तक पहुंचने में असमर्थ हूं।

def get_course_serializer(fields, read_only_fields=None):
    class CourseSerializer(serializers.ModelSerializer):
        if "id" in fields:
            id = serializers.CharField(default="", read_only=True)
    
        class Meta:
            model = Course
            fields = fields
            if read_only_fields:
                read_only_fields = read_only_fields

return CourseSerializer

यहां फ़ील्ड CourseSerializer वर्ग परिभाषा के अंदर पहुंच योग्य नहीं हैं। मैंने वैश्विक कीवर्ड का उपयोग करने की कोशिश की, लेकिन यह काम नहीं किया।

मैं नीचे के रूप में इस समारोह का उपयोग करने की योजना बना रहा हूँ

CourseListSerializer = get_course_serializer(
["id", "title", "slug", "description"])
0
Shahrukh Mohammad 31 पद 2020, 10:42
क्या global के बजाय nonlocal काम करता है? यदि नहीं, तो आपको type docs के 3 तर्क फॉर्म का उपयोग करना पड़ सकता है .python.org/3/library/functions.html#type
 – 
Iain Shelvington
31 पद 2020, 10:46
मेरा सुझाव है कि आप पायथन नेमस्पेस और स्कोप पर पढ़ लें, आप जीत गए' अपनी कक्षा परिभाषा में fields तक पहुंचने में सक्षम नहीं हूं। लेकिन आप गतिशील रूप से types (डॉक्टर यहां देखें) का उपयोग कर सकते हैं अपनी कक्षा परिभाषा बनाएं।
 – 
yvesonline
31 पद 2020, 10:46
नॉनलोकल भी काम नहीं करता है। type का उपयोग करने के लिए, मुझे विधि परिभाषाएँ और विशेषताएँ प्रदान करनी होंगी, इसलिए मूल रूप से मुझे type के लिए आवश्यक सभी फ़ील्ड प्रदान करने होंगे। तो फिर से बहुत सारे कोड दोहराव होंगे।
 – 
Shahrukh Mohammad
31 पद 2020, 10:51
1
लेकिन आपको इसे अपने दृष्टिकोण में भी करना होगा या क्या मुझे कुछ याद आ रहा है? आपको हमेशा अपनी विशेषताओं और वर्ग विधियों को परिभाषित करने की आवश्यकता है? मैंने type दृष्टिकोण का उपयोग करके एक उत्तर पोस्ट किया है। आप types का भी उपयोग कर सकते हैं लेकिन मुझे इस मामले में इसका उपयोग करने का कोई लाभ नहीं दिख रहा है।
 – 
yvesonline
31 पद 2020, 10:58

1 उत्तर

सबसे बढ़िया उत्तर

आप अपनी कक्षा को गतिशील रूप से बनाने के लिए type का उपयोग कर सकते हैं, इस तरह कुछ काम करना चाहिए (अवांछित):

def get_course_serializer(fields, read_only_fields=None):
    mapping = {}
    if "id" in fields:
        mapping["id"] = serializers.CharField(default="", read_only=True)
    ...
    CourseSerializer = type("CourseSerializer", (serializers.ModelSerializer, ), mapping)
    return CourseSerializer
2
yvesonline 31 पद 2020, 11:01
सोचें कि आपको मेटा क्लास को गतिशील रूप से भी बनाना होगा और इसे मैपिंग में पास करना होगा
 – 
Iain Shelvington
31 पद 2020, 11:07
हां, संपादन में परीक्षण किए गए कोड सहित। बहुत बहुत धन्यवाद, यवेसनलाइन !! इस तरह काम करता है, लेकिन क्या यह करने का यह सबसे अच्छा तरीका है, या कक्षाओं को गतिशील रूप से बनाने के बेहतर तरीके हैं?
 – 
Shahrukh Mohammad
31 पद 2020, 11:12