(Примечание: может быть полезно, если вы объясните, почему вы этого хотите. Возможно, есть лучший способ решения основной проблемы.)
Возможно ли это?
Не только с ForeignKey, поскольку вы перегружаете значения столбцов двумя разными значениями, без надежного способа их различения. (Например, что произойдет, если новая запись в целевой таблице будет создана с первичным ключом, совпадающим со старыми записями в ссылочной таблице? Что будет с этими старыми ссылочными записями при удалении новой целевой записи?)
Обычное специальное решение этой проблемы состоит в том, чтобы определить столбец типа или тега рядом с внешним ключом, чтобы различать различные значения (но см. Ниже).
Для этого нужны родовые отношения?
Да, частично.
GenericForeignKey - просто вспомогательный помощник Django для вышеприведенного шаблона; он связывает внешний ключ с тегом типа, который определяет, к какой таблице / модели он относится (используя соответствующий ContentType модели; см. contenttypes )
Пример: * * один тысяча двадцать-одна
class Foo(models.Model):
other_type = models.ForeignKey('contenttypes.ContentType', null=True)
other_id = models.PositiveIntegerField()
# Optional accessor, not a stored column
other = generic.GenericForeignKey('other_type', 'other_id')
Это позволит вам использовать other
как ForeignKey, чтобы ссылаться на экземпляры вашей другой модели. (В фоновом режиме GenericForeignKey получает и устанавливает other_type
и other_id
для вас.)
Чтобы представить число, которое не является ссылкой, вы должны установить other_type
на None и просто использовать other_id
напрямую. В этом случае попытка доступа к other
всегда будет возвращать None вместо повышения DoesNotExist
(или возврата непреднамеренного объекта из-за столкновения идентификатора).