2009-04-08 4 views
18

Есть ли способ установить внешний ключ в django в поле другой модели?Django Модельный набор внешнего ключа к полю другой модели

Например, представьте, что у меня есть объект ValidationRule. И я хочу, чтобы правило определяло, какое поле в другой модели должно быть проверено (а также какая-либо другая информация, например, может ли она быть нулевой, тип данных, диапазон и т. Д.)

Есть ли способ сохранить это полевое отображение в django?

ответ

16

Да и нет. Связь FK описывается на уровне класса и отражает ассоциацию FK в базе данных, поэтому вы не можете добавлять дополнительную информацию непосредственно в параметр FK.

Вместо этого я рекомендую иметь строку, которая содержит имя поля на другой таблице:

class ValidationRule(models.Model): 
    other = models.ForeignKey(OtherModel) 
    other_field = models.CharField(max_length=256) 

Таким образом, вы можете получить поле с:

v = ValidationRule.objects.get(id=1) 
field = getattr(v, v.other_field) 

Обратите внимание, что если вы используете поля «многие-ко-многим» (а не «один-ко-многим»), есть встроенная поддержка для создания пользовательских промежуточных таблиц для хранения метаданных с опцией through.

65

Я не пробовал это, но мне кажется, что с Django 1.0 вы можете сделать что-то вроде:

class Foo(models.Model): 
    foo = models.ForeignKey(Bar, to_field='bar') 

Документация для этого является here.

+4

+1 - приятно найти! –

+2

, пожалуйста, прочитайте вопрос еще раз. – ultrajohn

+0

Именно то, что я искал. Надеюсь, это также означает, что я могу сделать 'foo.foo_bar = value_bar'. Без запроса Bar –

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