Django Model устанавливает внешний ключ в поле другой модели - PullRequest
21 голосов
/ 08 апреля 2009

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

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

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

Ответы [ 2 ]

75 голосов
/ 04 января 2010

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

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

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

18 голосов
/ 08 апреля 2009

Да и нет. Отношение 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)

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

...