Форум программистов, компьютерный форум, киберфорум
netBool
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Полиморфизм в моделях джанго

Запись от netBool размещена 30.03.2018 в 17:46
Показов 3841 Комментарии 0

Маленькая запись-напоминалочка, что в джанго можно использовать полиморфизм в том числе и в полях модели.
Для этого можно использовать ContentType для реализации абсолютно обобщенных (иногда говорят “полиморфных”) отношений между моделями.
Классический джанго-полиморфизм на уровне модели выглядит это примерно так:
Python
1
2
3
4
5
6
7
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
 
class Note(models.Model): #Note
    Target_Type = models.ForeignKey(ContentType)             
    TargetId = models.PositiveIntegerField()    
    ToTarget = GenericForeignKey('Target_Type', 'TargetId')
Как это реализовать?
Существуют три правила по созданию и настройке GenericForeignKey:

Создайте в вашей модели поле типа ForeignKey, указав в качестве внешней модели ContentType. Обычно такому полю дают имя “content_type”.

Создайте в вашей модели поле, которое будет хранить значения первичных ключей экземпляров модели, с которой вы создаете связь. Для большинства моделей, это поле типа PositiveIntegerField. Обычно такому полю дают имя “object_id”.

Создайте в вашей модели поле типа GenericForeignKey, и передайте ему в качестве аргументов, имена полей созданных ранее. Если эти поля названы “content_type” и “object_id”, вы можете не передавать их, – эти имена используются в GenericForeignKey по умолчанию.
Это перевод оф. документации от джбук.ру

В том же переводе сказано, что в 1.9 уберут эту возможность. Но в django 1.11 она по прежнему есть

Итак, после создания связи мы можем использовать API, похожий на тот, что используется в обычном ForeignKey; каждый Note содержит поле ToTarget, которое возвращает связанный с ним объект. Мы можем присвоить этому полю произвольный объект, или указать этот объект при создании Note:

Python
1
Note(ToTarget=User.objects.get(username='Mima'))
(Также GenericForeignKeys не отображется в ModelForms)

Как многие, наверное, заметили, эта возможность не связана с наследованием, как принято в языках программирования. Но наследование так же есть в джанго. Для этого необходимо объявить абстрактную модель, от которой будем наследоваться, вот так:

Python
1
2
3
class MyBaseModel(models.Model):
    class Meta:
        abstract = True    # данное поле указывает, что класс абстрактный
И дальше:
Python
1
2
3
4
5
class Comment(PostBase):
    class Meta:
        db_table = "comments"
 
    article = models.ForeignKey(Article)
Абстрактная модель не создает таблиц.

Это очень хорошая возможность сократить код. Итак, домашнее задание: можно ли ее использовать так же и для полиморфизма?
Размещено в Django
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Video: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru