首页 > 解决方案 > 重写 BaseInlineFormset 的删除函数

问题描述

我正在考虑对记录进行软删除。如果“网站”不是外键(例如“RetailerRatingGroup”),则应照常删除。但是,它是另一个对象的外键,我想取消删除,而是将 Website.active 属性更改为 false。谁能指出我应该如何去做的正确方向。

class Website(models.Model):
    retailer = models.ForeignKey('Retailer', on_delete=models.PROTECT)
    url = models.URLField()
    short_name = models.CharField(max_length=15)
    active = models.BooleanField(default=True)

class RetailerRatingGroup(models.Model):
    retailer = models.ForeignKey(Retailer, on_delete=models.PROTECT)
    channel_productcat = models.ForeignKey('ChannelProductcatGroup', on_delete=models.PROTECT)
    website = models.ForeignKey(Website, blank=True, null=True, on_delete=models.PROTECT)
    current_rating = models.ForeignKey('Rating', default=None, blank=True, null=True, on_delete=models.SET_DEFAULT)

标签: djangodjango-forms

解决方案


好的......所以在环顾四周后,我发现了以下内容:

class SoftDeleteInlineFormset(BaseInlineFormSet):
    def delete_existing(self, obj, commit=True):
        if commit:
            if not obj.retailerratinggroup_set.all().exists():
                obj.delete()
            else:
                obj.active = False
                obj.save()

WebsiteFormSet = inlineformset_factory(Retailer, Website, form=WebsiteForm, formset=SoftDeleteInlineFormset, max_num=10, extra=3, can_delete=True)

理想情况下,最好查看是否有任何模型使用网站实例作为外键。


推荐阅读