Добрый день, Коллеги! Вот застрял на такой задаче: Имеется тип, имеется категория, сущности относятся друг к другу как м2м. Категории имеют иерархию, реализованную через mptt.
Требуется при добавлении через админку связи тип-категория добавить к данному типу связь со всеми дочерними категориями данной.
Нашёл в интернете совет явно указать таблицу связи посредством through, и в метод save данной таблицы добавить свою логику, но этот метод не вызывается. В чём причина - я не знаю.
Код:
class AdType(models.Model):
"""
Класс для типов
"""
name = models.CharField(_(u'Название'), max_length=100)
slug = models.SlugField(_(u'Слаг'), max_length=50, unique=True, help_text=_(u'Наименование в URL'))
created_date = models.DateTimeField(_(u'Дата создания'), auto_now_add=True)
updated_date = models.DateTimeField(_(u'Дата обновления'), auto_now=True)
active = models.BooleanField(default=True, verbose_name=_(u'Включён'))
position = models.PositiveIntegerField(_(u'Позиция'), default=1, help_text=_(u'Влияет на порядок отображения списка типов'))
sites = models.ManyToManyField(Site, verbose_name=_(u'Сайты'), help_text=_(u'Отображать тип на следующих сайтах'))
categories = models.ManyToManyField(Category, verbose_name=_(u'Категории'), help_text=_(u'Категории для данного типа объявлений'), related_name='types', through='AdTypeToCategories')
objects = BatchManager()
class Meta:
ordering = ['position']
verbose_name = _(u'тип')
verbose_name_plural = _(u'Типы')
def __unicode__(self):
return self.name
class AdTypeToCategories(models.Model):
ad_type = models.ForeignKey(AdType)
category = models.ForeignKey(Category)
def save(self, *args, **kwargs):
self.add_category()
super(AdTypeToCategories, self).save(*args, **kwargs)
def add_category(self):
"""
При выборе категорий выбирает и все дочерние категории
При снятие категории, снимает и со всех дочерних
"""
# Если это новая категория
if not self.pk:
# То добавим все её дочерние категории
child_categories = self.category.get_children()
self.ad_type.categories.add(child_categories)
self.ad_type.save()
class Meta:
db_table = 'catalog_adtype_categories'
auto_created = AdType
Помню, в Django есть оптимизация для массового редактирования, возможно на неё я и попал, а как её явно обойти - не помню.