2016-10-20 2 views
0

Если у меня есть модель, как следующее:Как перебирать каждый внешний ключ в модели?

class Keyword(models.Model): 
    model1 = models.ForeignKey(Model1, null=True, blank=True, default=None) 
    model2 = models.ForeignKey(Model2, null=True, blank=True, default=None) 
    model3 = models.ForeignKey(Model3, null=True, blank=True, default=None) 
    model4 = models.ForeignKey(Model4, null=True, blank=True, default=None)  
    not_foreign_key = models.CharField(max_length=10, null=True, blank=True) 

Как я могу перебрать каждый внешний ключ?

Я себе какой-то цикл, как это (псевдокод):

for each foreign key in Keyword: 
    do something with the foreign key 

Спасибо за вашу помощь.

+1

Возможный дубликат [Джанго внешнего ключа: получить связанные модели] (http://stackoverflow.com/questions/10347210/django -foreign-key-get-related-model) – ozgur

+0

Вы хотите выполнить итерацию описаний полей или хотите получить доступ ко всем полям внешнего ключа экземпляра модели? – Sebastian

+0

@ozgur Да, это в основном, спасибо. Что-то вроде: для поля в Keyword._meta.fields: if field.get_internal_type() == "ForeignKey": ... –

ответ

2

Вы можете использовать частный API, чтобы получить все инородные ключевую информацию:

# 'instance' is an instance of any kind of Django model 
fields = instance._meta._get_fields(forward=True, reverse=False) 
for field in fields: 
    obj_field_value = field.value_from_obj(instance) # This is the value the instance has for this field 
    foreign_key_related_model = field.related_model # returns the model the foreign key links to. There are plenty more properties here 
+0

Благодарим вас за помощь. Я потрачу некоторое время на переваривание того, что вы написали. –

+0

В Django рекомендуется использовать открытый метод 'get_fields()' (вместо '_get_fields()') https://docs.djangoproject.com/en/1.10/ref/models/meta/#django.db.models .options.Options.get_fields – Risadinha

+0

@Risadinha Удачи, поставляя параметры 'forward' и 'reverse' для публичной функции. Я не мог заставить его работать без использования частного API. – Sebastian

Смежные вопросы