#python #django #django-models #foreign-keys
#python #django #django-модели #внешние ключи
Вопрос:
Итак, у меня есть модель, комментарий. В нем он должен сохранять ссылку на то, к чему он комментирует.
Это может быть ответ на сообщение в блоге, или это может быть ответ на другой комментарий и т.д.
Итак, как мне сохранить эту связь? Обычно я бы просто сохранял информацию с помощью ForeignKey. Но ForeignKey требует, чтобы он знал тип модели, на которую он ссылается.
Есть ли что-то встроенное в Django, например, ForeignKey, которое может ссылаться на любой тип модели? Если нет, каковы наилучшие способы реализации такой взаимосвязи?
Вот о чем я подумал:
Я мог бы использовать целое число для хранения идентификатора объекта, на который он отвечает, а затем символьное поле для хранения типа, и тогда я бы получил объект, выполнив что-то вроде globals()[type_name].objects.get(id=id)
но я думаю, что в будущем у меня возникли бы некоторые проблемы, если бы мне когда-нибудь понадобилось выполнить что-то сложное, например, поиск, если бы я использовал этот метод.
В качестве альтернативы, я мог бы создать другой класс комментариев для каждого объекта, на который он мог бы отвечать (автоматически, конечно). Но опять же, это вызывает ограничения. Я больше не мог легко делать такие вещи, как Comment.objects.get(id=5)
Или я мог бы иметь в своем классе комментариев ForeignKey для каждой возможной вещи, на которую он мог бы отвечать, оставляя все, кроме 1 null для каждого комментария. Все еще похоже на неполное решение.
Предложения?
Ответ №1:
Проверьте GenericForeignKey во встроенном contenttypes
фреймворке.
Комментарии:
1. На странице написано, что я не могу так просто использовать
objects.filter
с GenericForeignKey. Если у меня есть объект, и я хочу получить все комментарии, опубликованные в ответ на него, как мне это сделать?2. Прокрутите немного дальше вниз и ознакомьтесь с
GenericRelation
классом. docs.djangoproject.com/en/dev/ref/contrib/contenttypes /…
Ответ №2:
Вам нужны общие отношения Django.