2012-04-27 27 views
13

क्या विदेशी कुंजी क्षेत्र के माध्यम से विदेशी कुंजी का संबंधित मॉडल स्वयं प्राप्त करना संभव है?Django विदेशी कुंजी: संबंधित मॉडल प्राप्त करें?

उदाहरण के लिए, मैं 3 मॉडल है, तो:

class ModelA(models.Model) 
    field1 = models.CharField(max_length=10) 

class ModelB(models.Model) 
    field1 = models.CharField(max_length=10) 

class ModelC(models.Model) 
    field1 = models.CharField(max_length=10) 
    field2 = models.ForeignKey(ModelA) 
    field3 = models.ForeignKey(ModelB) 

और मैं क्या करना चाहते हैं:

for field in ModelC._meta.fields: 
    if field.get_internal_type() == "ForeignKey": 
     #get the related model for field e.g. ModelA or ModelB 

बल्कि मॉडल के उदाहरण से सिर्फ मॉडल खुद को का उपयोग करना संभव है?

उत्तर

19

ModelA "foo" नामक एक FK क्षेत्र है, तो फिर यह कैसे आप संबंधित मॉडल मिल सकता है:

for field in ModelC._meta.fields: 
    if field.get_internal_type() == "ForeignKey": 
     print field.rel.to 

हैं:

ModelA._meta.get_field('foo').rel.to 
अपने कोड के साथ

, यह कैसा दिखेगा लंबे समय से खोल में टैब पूर्णता का उपयोग कर इसे पाया, यह अभी भी काम करता है। हो सकता है कि आप इस तरह के इंजीनियर को रिवर्स करने के लिए खोल का उपयोग करना सीखें।

+0

अद्यतन: नए जारी किए गए Django 2.0 में, ऐसा लगता है कि "rel" अब नहीं है ForeignKey का एक क्षेत्र। आप कोशिश कर सकते हैं: 'ModelA._meta.get_field (' foo ')। Related_model'। मैं कमांड लाइन में ऑटो-पूर्ण करने के लिए "टैब" टाइप करके इसे समझता हूं। –

0

इस तरह के संबंध निकालने का प्रयास करते समय, मैं बहुत कमांड-लाइन प्रयोग का उपयोग करता हूं। मेरे द्वारा उपयोग किया जाने वाला एक सामान्य पैटर्न _=starting_point.<chained_attributes>;pprint((_, dir(_))) है। उदाहरण के लिए:

_=ModelC;pprint((_, dir(_))) 
_=ModelC.field2;pprint((_, dir(_))) 
_=ModelC.field2.field;pprint((_, dir(_))) 
_=ModelC.field2.field.rel;pprint((_, dir(_))) 
_=ModelC.field2.field.rel.to;pprint((_, dir(_))) 

(आप, from pprint import pprint पहले ऐसा करने के लिए स्वाभाविक रूप से करना होगा।) यही कारण है कि मुझे जोड़ने/विशेषताओं को दूर करने के लिए एक तक के साथ प्रयोग आइटम मैं चाहता हूँ लगता है की सुविधा देता है ... जबकि स्पष्ट रूप से दिखाई दे रहा है कि मैं क्या मिल गया है और अगले स्तर पर क्या उपलब्ध है। इससे, मुझे ModelC.field2.field.rel.to == ModelA मिलता है। रिवर्स रिलेशनशिप का पता लगाने के लिए एक ही आधार पैटर्न का उपयोग किया जा सकता है, कक्षा से बजाए एक उदाहरण से शुरू होने वाले कई रिश्ते आदि।

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