重写BaseInlineFormset的删除功能

时间:2019-02-08 15:01:27

标签: django django-forms

我正在考虑对记录进行软删除。如果“网站”不是外键(例如“ 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)

1 个答案:

答案 0 :(得分:0)

好的...所以在四处张望之后,我发现了以下内容:

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)

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