2012-05-16 21 views
13

क्या कोई नया मॉडल बनाते समय विदेशी कुंजी के लिए मॉडल उदाहरण में पास करने का कोई तरीका नहीं है? मान लीजिए कि मैं निम्नलिखित मॉडल हैं:Django ForeignKey इंस्टेंस बनाम रॉ आईडी

class Foo(models.Model): 
    description = models.CharField(max_length=100) 

    class Meta: 
     db_table = u'foo' 

class Bar(models.Model): 
    info = models.CharField(max_length=100) 
    foo = models.ForeignKey('Foo') 

    class Meta: 
     db_table = u'bar' 

बाद में एक पोस्ट अनुरोध एक दृश्य करने के लिए आता है - मैं एक foo रिकॉर्ड की आईडी को जानते हैं और सिर्फ बार तालिका में एक रिकॉर्ड सम्मिलित करना चाहते हैं।

अगर मैं करता हूँ: ":"

new_bar = Bar(info="something important", foo=foo_id) 
new_bar.save() 

मैं एक ValueError कह 546456487466L "आवंटित नहीं कर सकते" मिलता है। इसलिए "एक बस हो" फू "उदाहरण के Bar.foo

, मैं समझ गया। .. यह चाहता है कि मुझे फू मॉडल का वास्तविक उदाहरण मिल जाए। मैं समझता हूं कि मैं सिर्फ फू पर पहुंच सकता हूं और फिर इसे पास कर सकता हूं। लेकिन, ऐसा लगता है कि इस कार्यक्षमता को ओवरराइड करने का कोई तरीका होना चाहिए। मैंने किया है कुछ googling और दस्तावेज़ों को पढ़ना, और व्यवस्थापक में raw_id_fields मूल विचार प्रतीत होता है। (जो कहने के लिए, यहां कच्चे आईडी की अनुमति दें)। लेकिन, विदेशी विकल्प फ़ील्ड पर यह विकल्प न देखें।

आईडी प्राप्त करने के लिए ऑब्जेक्ट प्राप्त करने के लिए डेटाबेस में एक राउंड ट्रिप करना बहुत अक्षम है (जो मेरे पास पहले से है)। मैं समझता हूं कि राउंड ट्रिप करने से यह मान्य होता है कि आईडी डेटाबेस में मौजूद है। लेकिन, हे ... यही कारण है कि मैं एक आरडीबीएमएस का उपयोग कर रहा हूं और पहले स्थान पर विदेशी कुंजी रखता हूं।

धन्यवाद

+0

ग्रेट, क्लासिक एसओ-आईश सवाल। – trpt4him

उत्तर

20
new_bar = Bar(info="something important", foo_id=12345) 
new_bar.save() 

तुम भी foreign key values directly मिल सकती है। कुछ प्रकार का अनुकूलन।

+0

यह काम किया ... मुझे तब तक समस्याएं थी जब तक मुझे कुछ पता नहीं चला। यहां 1 छोटा नोट जोड़ने और ऊपर दिए गए उत्तर को संपादित करने जा रहा है। ऊपर दिए गए मेरे उदाहरण में, मैं वास्तव में थोड़ा सा सरल था। वास्तविक मॉडल में, "foo" तालिका की प्राथमिक कुंजी "आईडी" नहीं थी। और विदेशी "foo_id" नहीं था। लेकिन, आपको इसे काम करने के लिए फ़ील्डनाम + "_ आईडी" का उपयोग करने की आवश्यकता होगी। –

+1

यह अजीब बात नहीं है कि यह डबल अंडरस्कोर नहीं है, क्योंकि आईडी फू का एक क्षेत्र है। आप कम से कम क्वेरीसेट में डबल अंडरस्कोर का उपयोग करते हैं। – radtek

+0

@radtek ऐसा इसलिए है क्योंकि आप Foo के आईडी फ़ील्ड का उपयोग नहीं कर रहे हैं, आप बार के foo_id फ़ील्ड का उपयोग कर रहे हैं। यदि आप किसी प्रकार के डेटाबेस क्लाइंट का उपयोग करते हैं तो आप देखेंगे कि 'appname_foo' में कॉलम 'आईडी' है और' appname_bar' में कॉलम 'foo_id' है। मेरा मतलब है अन्यथा आप कैसे जानते होंगे कि प्रत्येक बार में कौन सा फू जाता है? तो इस मामले में भी क्वेरीसेट में आप आईडी के साथ व्यवहार करते समय डबल अंडरस्कोर का उपयोग नहीं करेंगे (और नहीं), (आप उस तरह से शामिल होने से बचें)। – semicolon

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