django временно отключает сигналы

У меня есть обратный вызов сигнала в django:

@receiver(post_save, sender=MediumCategory)
def update_category_descendants(sender, **kwargs):

    def children_for(category):
        return MediumCategory.objects.filter(parent=category)

    def do_update_descendants(category):
        children = children_for(category)
        descendants = list() + list(children)

        for descendants_part in [do_update_descendants(child) for child in children]:
            descendants += descendants_part

        category.descendants.clear()
        for descendant in descendants:
            if category and not (descendant in category.descendants.all()):
                category.descendants.add(descendant)
                category.save()
        return list(descendants)

    # call it for update
    do_update_descendants(None)

но в теле функции я использую .save()для моделей MediumCategory, что означает, что сигнал отправляется снова. Как я могу отключить его; идеальным решением было бы утверждение withс некоторой «магией» внутри.

ОБНОВЛЕНИЕ: Это окончательное решение, если кому интересно.

class MediumCategory(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(blank=True)
    parent = models.ForeignKey('self', blank=True, null=True)
    parameters = models.ManyToManyField(AdvertisementDescriptonParameter, blank=True)
    count_mediums = models.PositiveIntegerField(default=0)
    count_ads = models.PositiveIntegerField(default=0)

    descendants = models.ManyToManyField('self', blank=True, null=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.name)
        super(MediumCategory, self).save(*args, **kwargs)

    def __unicode__(self):
        return unicode(self.name)
(...)
@receiver(post_save, sender=MediumCategory)
def update_category_descendants(sender=None, **kwargs):
    def children_for(category):
        return MediumCategory.objects.filter(parent=category)

    def do_update_descendants(category):
        children = children_for(category)
        descendants = list() + list(children)

        for descendants_part in [do_update_descendants(child) for child in children]:
            descendants += descendants_part

        if category:
            category.descendants.clear()
            for descendant in descendants:
                category.descendants.add(descendant)
        return list(descendants)

    # call it for update
    do_update_descendants(None)
13
задан bartek 14 July 2012 в 20:49
поделиться