Ich habe ein Signal Rückruf in django:django vorübergehend deaktivieren Signale
@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)
aber in der Funktion Körper Ich verwende .save()
auf Modelle MediumCategory
die Couses, dass das Signal wieder ausgelöst wird. Wie kann ich es deaktivieren? die perfekte Lösung wäre eine with
Aussage mit etwas "Magie" innen.
UPDATE: Das ist endgültige Lösung, wenn jemand interessiert.
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)
ok, das ist, was ich gesucht habe: 'disconnect' ist die Lösung, es in' with' Aussage zu setzen ist eine Frage der Reinheit :) Aber nach dem Entfernen 'save()', 'disconnect' wird nicht benötigt. Perfekt. – bartek
Sie haben Recht, 'save()' wird nicht benötigt. – bartek