2009-04-18 49 views
26

क्या मुझे ऑब्जेक्ट फ़ील्ड का मान "obj.field" से किसी अन्य तरीके से प्राप्त हो सकता है। क्या कुछ "obj.get ('field')" मौजूद है? क्षेत्र के मूल्य को स्थापित करने के लिए वही बात।django ऑब्जेक्ट प्राप्त/सेट फ़ील्ड

+0

संभावित डुप्लिकेट [कैसे introspect django मॉडल फ़ील्ड?] (Http://stackoverflow.com/questions/2384436/how-to-introspect-django-model-fields) –

उत्तर

65

एक फ़ील्ड का मान प्राप्त करने के लिए (हालांकि मैं 100% यकीन नहीं है):

getattr(obj, 'field_name') 

एक क्षेत्र का मान सेट करने के लिए:

setattr(obj, 'field_name', 'field value') 

प्राप्त करने के लिए Django ऑब्जेक्ट के लिए सभी फ़ील्ड और मान:

[(field.name, getattr(obj,field.name)) for field in obj._meta.fields] 

आप Model _meta API के दस्तावेज़ीकरण को पढ़ सकते हैं जो वास्तव में उपयोगी है।

+2

या, शब्दकोश से वस्तुओं के साथ '' obj '' को अपडेट करने के लिए: [dictionary ,items()] – mariotomo

+0

में (कुंजी, मान) के लिए [setattr (obj, key, value) आप सर, एक प्रतिभाशाली हैं। – g33kz0r

6

आप इसे क्यों चाहते हैं?

आप इस्तेमाल कर सकते हैं

obj.__dict__['field'] 

मैं लगता है ... हालांकि यह एक विधि कॉल

changed=[field for (field,value) in newObj.__dict__ if oldObj.__dict__[field] != value] 

नहीं है जहाँ आप बदल कि सभी क्षेत्रों की एक सूची दे देंगे।

+0

उस ऑब्जेक्ट के लिए एक संपादन फ़ॉर्म सबमिट करने के बाद I है: oldObj = ObjModel.objects.get (पी = पी) newObj = editForm.save (प्रतिबद्ध = false) और मैं दो वस्तुओं की तुलना करना चाहते हैं, मुझे पता है जो खेतों संपादित रूप से बदल रहे थे की जरूरत है । क्या क्षेत्र को ऑब्जेक्ट फ़ील्ड की तुलना करके, ऐसा करने का कोई आसान तरीका है? – dandu

+0

हमेशा काम नहीं करता है (विदेशी कुंजी इसे तोड़ती है)। इसके बजाए @ जोआओ मार्कस उत्तर का प्रयोग करें। –

2

संबंधित क्षेत्रों पाने के लिए:

def getattr_related(obj, fields): 
    a = getattr(obj, fields.pop(0)) 
    if not len(fields): return a 
    else:    return getattr_related(a, fields) 

जैसे,

getattr_related(a, "some__field".split("__")) 

पता नहीं, शायद वहाँ एक ऐसा करने का बेहतर तरीका लेकिन यह मेरे लिए काम करता था।

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