Django: पूर्णांक का उपयोग करके विदेशी कुंजी सेट करें?


104

क्या किसी मॉडल के पूर्णांक आईडी का उपयोग करके विदेशी कुंजी संबंध स्थापित करने का एक तरीका है? यह अनुकूलन उद्देश्यों के लिए होगा।

उदाहरण के लिए, मान लीजिए कि मेरे पास एक कर्मचारी मॉडल है:

class Employee(models.Model):
  first_name = models.CharField(max_length=100)
  last_name = models.CharField(max_length=100)
  type = models.ForeignKey('EmployeeType')

तथा

EmployeeType(models.Model):
  type = models.CharField(max_length=100)

मैं असीमित कर्मचारी प्रकार होने की लचीलापन चाहता हूं, लेकिन तैनात आवेदन में केवल एक ही प्रकार की संभावना होगी, इसलिए मैं सोच रहा हूं कि क्या आईडी को हार्डकोड करने और इस तरह से संबंध स्थापित करने का कोई तरीका है। इस तरह मैं EmployeeType ऑब्जेक्ट को पहले प्राप्त करने के लिए db कॉल से बच सकता हूं।

जवाबों:


205

हां:

employee = Employee(first_name="Name", last_name="Name")
employee.type_id = 4
employee.save()

ForeignKeyफ़ील्ड _idअंत में एक विशेषता के साथ उनके मूल्य को संग्रहीत करते हैं , जिसे आप डेटाबेस तक जाने से बचने के लिए सीधे एक्सेस कर सकते हैं।

का _idसंस्करण ForeignKeyDjango का एक विशेष रूप से उपयोगी पहलू है, जिसे हर किसी को समय-समय पर पता होना चाहिए और उपयुक्त होने पर उपयोग करना चाहिए।

चेतावनी:

@RuneKaagaard बताते हैं कि employee.typeहाल के Django संस्करणों में बाद में सटीक नहीं है, यहां तक ​​कि कॉल करने के बाद भी employee.save()(यह अपना पुराना मूल्य रखता है)। इसका उपयोग करना निश्चित रूप से उपरोक्त अनुकूलन के उद्देश्य को पराजित करेगा, लेकिन मैं एक आकस्मिक अतिरिक्त प्रश्न को गलत होना पसंद करूंगा। तो सावधान रहें, इसका उपयोग केवल तब करें जब आप अपने उदाहरण (जैसे employee) पर काम कर रहे हों ।


10
क्या यह प्रलेखित है?
स्कॉट स्टैफोर्ड

8
सीधे विदेशी प्रमुख मूल्यों का उपयोग करना: docs.djangoproject.com/en/1.8/topics/db/optimization/…
Dan Oliphant

1
मैंने आज Django 1.7 पर यह परीक्षण किया, और यह वहां एक अच्छा विचार नहीं है। जब यह काम करता है, और typeक्षेत्र डेटाबेस को लिखा जाता है, यदि आप typeसंपत्ति तक पहुंचते हैं तो यह परिवर्तन को प्रतिबिंबित नहीं करता है। कोड में कहा गया है, यह विफल होगा assert(employe.type.id == 4)
रूण कागार्ड

3
@AmichaiSchreiber मुझे विश्वास है कि Django की अगली रिलीज़ इस समस्या के लिए ठीक होगी: code.djangoproject.com/ticket/27710
हार्डी

2
भविष्य में यहां आने वाले किसी भी व्यक्ति के लिए, यह समस्या Django 2.1 में तय की गई है ।
19

45

एक विकल्प जो ऑब्जेक्ट बनाने के लिए बनाता है और डेटाबेस को एक लाइन में सहेजता है:

employee = Employee.objects.create(first_name='first', last_name='last', type_id=4)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.