4

我有两个相关的(通过外键关系)模型,并为带有内联的父级创建了管理模型。在几种情况下(由布尔字段在管理员中编辑),我需要删除所有以前的对象(内联)并创建新对象。我尝试使用 save_model 来实现它,我可以在其中获取所有当前对象的属性并决定是否需要重新创建(内联)对象。楷模:

class Model1(models.Model):
    reformat = models.BooleanField(default=False)
    ...
class Model2(models.Model):
    model1 = ForeignKey(Model1, related_name='model2')
    ...

行政:

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_model(self, request, obj, form, change):
        super(Model1Admin, self).save_model(request, obj, form, change)
        if obj.reformat:
            obj.model2.all().delete()
            # creating new objects
            ...
        obj.save()

但是如果我尝试在 model_save 方法中删除这些对象,我会得到 ValidationError。还有其他可能解决这个问题吗?

4

1 回答 1

5

我也遇到了这个问题,并且在我的头撞到墙上一两个小时后,通过覆盖save_formset()管理对象而不是在调用超类的方法save_model()后进行所需的操作来解决它。save_formset()这样做意味着您正在删除的模型在保存表单集时仍然存在,因此您不会收到验证错误。

以下是您给出的示例中的样子:

class Model2Inline(admin.TabularInline):
    model = Model2

class Model1Admin(admin.ModelAdmin):
    inlines = [Model2Inline]
    def save_formset(self, request, form, formset, change):
        super(Model1Admin, self).save_formset(request, form, formset, change)
        if formset.model is Model2:
            obj = formset.instance
            if obj.reformat:
                obj.model2.all().delete()
                # creating new objects
                ...
            obj.save()
于 2012-01-11T14:57:03.963 回答