如何删除Django中的相关模型(多对多)?

如何删除Django中的相关模型(多对多)?,django,many-to-many,Django,Many To Many,我在Django中有两个模型,用于存储一些文档,还用于构建文档中单词的索引。以下是一些模型: class DMS_Dokument(models.Model): dms_dok_titel = models.CharField(max_length=255, blank=True) dms_dok_beschreibung = models.CharField(max_length=3000, blank=True, null=True) dms_dok_datei =

我在Django中有两个模型,用于存储一些文档,还用于构建文档中单词的索引。以下是一些模型:

class DMS_Dokument(models.Model):
    dms_dok_titel = models.CharField(max_length=255, blank=True)
    dms_dok_beschreibung = models.CharField(max_length=3000, blank=True, null=True)
    dms_dok_datei = models.FileField(max_length=255,upload_to='DMS/')
    dms_dok_hochgeladen_am = models.DateField()
    dms_dok_indiziert = models.BooleanField(default=False)
    dms_dok_gehoert_zu_app = models.CharField(max_length=255, choices=app_choices, blank=False, null=False)
    dms_dok_typ = models.CharField(max_length=255, choices=typ_choices, blank=False, null=False, default='Sonstiges')

    def save(self, *args, **kwargs):
        preserve_ext = extension(self.dms_dok_datei.name)
        neuer_dateiname = self.dms_dok_gehoert_zu_app + '_' + self.dms_dok_titel + '_' + self.dms_dok_hochgeladen_am.strftime("%d.%m.%Y")
        self.dms_dok_datei.name = neuer_dateiname + preserve_ext
        super(DMS_Dokument, self).save(*args, **kwargs)

    class Meta:
        app_label = 'DMS'

class DMS_Index_Data(models.Model):
    dms_ind_wort = models.CharField(max_length=255, blank=False, null=True)
    dms_ind_m2m = models.ManyToManyField(DMS_Dokument, related_name='indexes')
    #dms_ind_dok_fk = models.ForeignKey('DMS_Dokument', on_delete=models.CASCADE)

    class Meta:
        app_label = 'DMS'
        ordering = ['dms_ind_wort']

当我现在使用DeleteView来删除DMS_Dokument对象时,它将正确地从数据库中删除。但另一个表中的条目仍然保留。我如何告诉Django在删除文档时,也应该从与文档相关的条目中清除索引?这是否特别,因为我有多对多关系?

您可以覆盖模型上的
delete()
方法,就像覆盖
save()
方法一样

如果希望每次都删除m2m数据,那么重写
delete()
方法是一个好主意

class DMS_Dokument(models.Model):
    ...

    def save(self, *args, **kwargs):
        preserve_ext = extension(self.dms_dok_datei.name)
        neuer_dateiname = self.dms_dok_gehoert_zu_app + '_' + self.dms_dok_titel + '_' + self.dms_dok_hochgeladen_am.strftime("%d.%m.%Y")
        self.dms_dok_datei.name = neuer_dateiname + preserve_ext
        super(DMS_Dokument, self).save(*args, **kwargs)

    def delete(self):
        self.indexes.all().delete()
        super(DMS_Dokument, self).delete()

    class Meta:
        app_label = 'DMS'
您还可以为您的
DeleteViewe
覆盖
delete()
方法:

from django.shortcuts import get_object_or_404

def delete(self, request, *args, **kwargs):
    # get the DMS_Dokument pk. you might need to change this depending on your view
    instance_pk = self.kwargs['pk']
    instance = get_object_or_404(DMS_Dokument, pk=instance_pk)

    # delete the m2m first
    instance.indexes.all().delete()

    # delete the instance itself
    instance.delete()

非常感谢你。我只是在处理多对多的关系时遇到了一些困难,于是再次访问了这个帖子。