С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
netBool
Войти
Регистрация
Восстановить пароль
Оценить эту запись

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

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

Маленькая запись-напоминалочка, что в джанго можно использовать полиморфизм в том числе и в полях модели.
Для этого можно использовать 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
Просмотров 403 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru