2012-04-27 24 views
13

Yabancı anahtar alanının ilgili modelini yabancı anahtar alanından almak mümkün mü? ÖrneğinDjango Foreign Key: ilgili modeli al?

, ben 3 model varsa:

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) 

ve ben yapmak istiyorum:

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

ziyade modellerin örneklerini daha sadece manken kendileri kullanarak bu mümkün mü? Modela "foo" adlı bir FK alan varsa

cevap

19

, o zaman bu size bağlı modelini alabilirsiniz nasıl:

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

gerekirse: kod ile

ModelA._meta.get_field('foo').rel.to 

, bu şekilde görünecektir Uzun zaman önce kabukta sekmeyi tamamlayarak buldu, hala çalışıyor. Böyle bir şeyi tersine çevirmek için kabuğu kullanmayı öğrenmek isteyebilirsiniz.

+0

Güncelleştirme: Yeni yayımlanan Django 2.0'da, artık "rel" artık görünmüyor ForeignKey bir alan. Sen deneyebilirsiniz: 'ModelA._meta.get_field ('foo'). Related_model'. Komut satırında otomatik tamamlamak için "sekme" yazarak bunu anladım. –

0

Böyle ilişkileri çıkarmaya çalışırken çok fazla komut satırı denemesi yapıyorum. Kullandığım yaygın bir model _=starting_point.<chained_attributes>;pprint((_, dir(_))). Örneğin:

_=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(_))) 

(Sen doğal olarak from pprint import pprint ilk yapmanız gerekir.) Bu beni istediğim öğeyi bulmak bir kadar ekleme/özelliklerini kaldırarak denemeler yapabilirsiniz ... açıkça görerek bende ne ise ve bir sonraki seviyenin altında ne var. Bundan ModelC.field2.field.rel.to == ModelA'u alırım. Aynı temel örüntü, ters ilişkiyi, çoktan çoğa ilişkileri, sınıftan ziyade bir örnekle başlayarak, vb. Keşfetmek için kullanılabilir.

İlgili konular