2012-09-12 3 views
30

मेरे Django ऐप में, मैं मॉडलों से ऑब्जेक्ट्स को एक शब्दकोश में कैसे बदल सकता हूं जिसमें मॉडल ऑब्जेक्ट के विदेशी-कुंजी संदर्भ शामिल हैं?मैं Django मॉडल ऑब्जेक्ट्स को एक शब्दकोश में कैसे बदल सकता हूं और अभी भी उनकी विदेशी कुंजी है?

जब मैं इस प्रयास करें:

from django.forms.models import model_to_dict 
model_to_dict(instance, fields=[], exclude=[]) 

जिसके परिणामस्वरूप शब्दकोश केवल प्रत्यक्ष खाने हैं। मैं मॉडल ऑब्जेक्ट से संबंधित विदेशी कुंजी भी प्राप्त करना चाहता हूं। मैं यह कैसे कर सकता हूँ?

+0

_technically_ कि पोस्ट इस का एक डुप्लिकेट है .. –

उत्तर

0

यदि आप संबंधित मॉडलों के साथ काम करना चाहते हैं Django serialization पर देखने के लिए चाहते हो सकता है।

26
obj = get_object_or_404(CustomModel,id=some_id) 
my_dict = obj.__dict__ 
+0

मॉडल के साथ उपयोग के लिए इच्छित model_to_dict फ़ंक्शन को लागू करने के बजाय इस प्रॉपर्टी का उपयोग करने के लिए अधिक उचित लगता है। एक फायदा यह है कि __dict__ विशेषता गैर-संपादन योग्य फ़ील्ड को बहिष्कृत नहीं करती है। एक नुकसान यह है कि इसमें कई प्रकार के फ़ील्ड शामिल नहीं हैं (अंतर्निहित रिवर्स रिलेशनशिप मुझे लगता है)। –

+1

यह उपयोगकर्ता = user_id के रूप में अग्रगण कुंजी प्रदान करता है, मुझे यहां उपयोगकर्ता नाम चाहिए। यह कैसे करें?/ – Clayton

+0

संबंधित संबंधित के साथ क्वेरीसेट प्राप्त करें? इस तरह: MyModel.objects.select_related ('user__username')। (Pk = some_integer) प्राप्त करें – freylis

6

कैसे के बारे में:

model_to_dict(instance, fields=[field.name for field in instance._meta.fields]) 

स्पष्ट रूप से क्षेत्रों के सभी नामकरण करके, यह आप कम से कम विदेशी कुंजी आईडी देना चाहिए (हालांकि मैं सत्यापित नहीं किया है)।

ध्यान दें कि यह समारोह editable=False साथ खेतों वापस नहीं करता है (क्योंकि यह रूपों के लिए है)।

6

मुझे लगता है कि मैं एक ही जरूरत थी के रूप में आप - मैं एक वस्तु का एक सादा और सरल dict प्रतिनिधित्व करना चाहता था। अन्य उत्तरों पोस्ट किए गए (जब मैं लिखता हूं) मुझे वह नहीं देगा, और धारावाहिक, उनके उद्देश्य के लिए उपयोगी होने पर, अतिरिक्त जानकारी के साथ आउटपुट उत्पन्न करते हैं जो मैं नहीं चाहता, और एक असुविधाजनक संरचना।

from django.core import serializers 

def obj_to_dict(model_instance): 
    serial_obj = serializers.serialize('json', [model_instance]) 
    obj_as_dict = json.loads(serial_obj)[0]['fields'] 
    obj_as_dict['pk'] = model_instance.pk 
    return obj_as_dict 

एक सूची में django_model_object लपेटकर, तो पार्स करने json की जरूरत है, क्योंकि किसी कारण से, serializers केवल क्रमानुसार कर सकते हैं के बाद आइटम 0 तक पहुँचने:

हालांकि बेशक एक हैक, यह मुझे अच्छा लाभ दे रहा है मॉडल ऑब्जेक्ट्स (अजीब) के iterables।

आप मैं अगर मैं अंत कि लिखने के लिए की आवश्यकता होगी, वापस पोस्ट कर सकते हैं, विदेशी कुंजी क्षेत्रों के किसी भी प्रकार को संभालने के लिए कुछ अतिरिक्त गियर आवश्यकता होगी (जब तक किसी और पहले में यह संपादित करता है!)।

एचटीएच अब के लिए। अन्य उत्तर की

0

कोई भी काफी मेरे लिए काम किया। हालांकि, यह चाल चल रहा था।

def model_to_dict(instance, include=None, exclude=None): 
    fields = instance._meta.concrete_fields 
    if include is not None: 
     return {f.attname: getattr(instance, f.attname) for f in fields if f.name in include} 
    if exclude is not None: 
     return {f.attname: getattr(instance, f.attname) for f in fields if f.name not in exclude} 
    return {f.attname: getattr(instance, f.attname) for f in fields} 
0

मुझे कल्पना है कि आपने पहले ही इस मामले को अपने मामले के लिए हल कर लिया है, लेकिन मुझे कुछ जानकारी मिली क्योंकि मैं इसी तरह के समाधान ढूंढ रहा था। मैं एक टेम्पलेट में वस्तुओं और उनके क्षेत्रों/विशेषताओं तक पहुंचने में सक्षम होना चाहता था। मैं सिर्फ django सीख रहा हूँ।

जो मैंने अंत में पढ़ा था वह 'Generic Display Views' था, जो एक ऑब्जेक्ट उदाहरण या टेम्पलेट के साथ ऑब्जेक्ट्स की क्वेरीसेट भेजने में सक्षम प्रतीत होता है। फिर आप model.field जैसी वस्तुओं तक पहुंच सकते हैं, या भले ही यह एक विदेशी क्षेत्र है, model.foreignmodel.foreignmodelfield

तो यह मेरे लिए बहुत उपयोगी हो गया है। यह अलग-अलग वर्ग प्रबंधकों में कस्टम 'टू-डॉट' विधियों का एक समूह बनाने के बाद हुआ था। इसने मेरी बहुत मदद की। लेकिन आपको जेनेरिक व्यूज़ पर पढ़ना होगा और वास्तव में इच्छित विवरण प्राप्त करने के लिए उन्हें कैसे अनुकूलित करना होगा।

-मैट

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