【问题标题】:Django: Using signals to save a ManyToMany fieldDjango:使用信号保存多对多字段
【发布时间】: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")

【问题讨论】:

标签: python django


【解决方案1】:

正如@karthikr 提到的,要使用的正确信号是m2m_changed

只需从post_save 切换到该信号即可。

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2023-04-02
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2021-06-08
    • 2010-12-28
    • 2017-01-17
    相关资源
    最近更新 更多