我在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,在删除文档时,索引也应该从与其相关的条目中清除?这是特殊的吗,因为我有多对多的关系?
发布于 2020-07-14 17:20:27
您可以用覆盖save()方法的相同方式覆盖模型上的delete()方法。
如果您希望每次都删除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()https://stackoverflow.com/questions/62891471
复制相似问题