【发布时间】:2014-07-30 21:06:58
【问题描述】:
我正在尝试将 ManyToMany 字段发布保存在模型中。在 save() 方法中不可能这样做,因为对象不存在。所以我尝试将逻辑放入信号中。我的问题是:每次我创建一个新的 FaculteAdmissions 对象时,信号似乎都会触发两次。主要症状是信号输出重复。这是代码,会更明显一点。
型号:
class FaculteAdmissions(models.Model):
trimestre = models.IntegerField(unique=True)
session = models.CharField(max_length=25)
annee = models.CharField(max_length=10)
date_lecture = models.DateField()
data = models.ManyToManyField(Admissions)
def save(self, *args, **kwargs):
"""
Exécuté avant la sauvegarde d'un objet de ce modèle.
Validera si dans la table Admissions il existe des données pour ce trimestre.
"""
# valide l'unicité
if FaculteAdmissions.objects.filter(trimestre=self.trimestre).exists():
raise ValidationError("Un objet ayant ces valeurs existe déjà")
else:
# valide les données
q = Admissions.objects.filter(trimestre=self.trimestre,
niveau=constantes.NIVEAUX_LECTURE_BD[2])
if not q.exists():
raise ValidationError("Données introuvables dans la table Admissions")
# OK!
super(FaculteAdmissions, self).save(*args, **kwargs)
# Envoie signal pour mettre à jour les données
post_save.send(sender=self.__class__, instance=self, created=True)
def __str__(self):
return "Faculté - Admissions"
相关信号:
def creation_faculte_admissions(sender, instance, created, **kwargs):
if created:
# valide les données
q = Admissions.objects.filter(trimestre=instance.trimestre,
niveau=constantes.NIVEAUX_LECTURE_BD[2])
instance.data = q
print("Données ajouté pour " + str(instance) + str(instance.trimestre))
和信号连接:
post_save.connect(creation_faculte_admissions, sender=FaculteAdmissions, dispatch_uid="faculte_admissions")
【问题讨论】:
-
m2m_changed可能是您需要的:docs.djangoproject.com/en/dev/ref/signals/#m2m-changed -
我不确定。
m2m_changed似乎在更改 M2M 字段时触发。我需要在创建对象时触发它。编辑:没关系,它确实有效!谢谢