Я исправил проблему, используя встроенный сигнал django.db.models.signals.m2m_changed.
В моем случае мне приходится обновлять связанный экземпляр другой модели каждый раз, когда изменяется ManyToMany, и, как вы знаете, переопределение Model.save() не работает.
Вот мои (французские и упрощенные) модели:
class BaseSupport(EuidModel):
nom = models.CharField(max_length=100, blank=True)
periodicite = models.CharField('périodicité', max_length=16,
choices=PERIODICITE_CHOICES)
jours_de_parution_semaine = models.ManyToManyField('JourDeLaSemaine', blank=True)
class Meta:
abstract = True
class Support(BaseSupport):
pass
def save(self, *args, **kwargs):
create_cahier_principal = False
if not self.pk:
create_cahier_principal = True
super(Support, self).save(*args, **kwargs)
if create_cahier_principal:
c = Cahier.objects.create(support=self,ordre=1, numero=1,
nom=self.nom, nom_court=self.nom_court,
euid=self.euid, periodicite=self.periodicite)
class Cahier(BaseSupport):
"""Ex : Cahier Saumon du Figaro Quotidien."""
support = models.ForeignKey('Support', related_name='cahiers')
ordre = models.PositiveSmallIntegerField()
numero = models.PositiveSmallIntegerField(u'numéro', null=True, blank=True)
def sync_m2m_cahier_principal(sender, **kwargs):
if kwargs['action'] not in ('post_add', 'post_clear', 'post_remove'):
return
support = kwargs['instance']
cahier_principal = support.cahiers.get(euid=support.euid)
cahier_principal.jours_de_parution_semaine.clear()
if kwargs['action'] == 'post_clear':
return
for jour in support.jours_de_parution_semaine.all():
cahier_principal.jours_de_parution_semaine.add(jour)
m2m_changed.connect(sync_m2m_cahier_principal,
sender=Support.jours_de_parution_semaine.through)
Возможно, это решение далеко от идеального, но я ненавижу патчить Django!
person
Stan
schedule
18.05.2011