使用Django admin时,ManyToMany字段未保存

kb.*_*kb. 11 python django django-orm m2m

我遇到了一个奇怪的问题,我希望这里的某些人能够对此有所了解.

我正在重写模型的save()方法,以便在运行super()之后向ManyToMany字段添加一些值.我的问题是,当我在Django admin中保存时,值似乎被添加到关系中,但然后再次为空.

但是,如果我这样做,manage.py shell它没有问题.

我已经在那里放了两个打印语句,无论我是通过Django admin还是通过shell运行它,它们都会产生完全相同的输出.

class Store(models.Model):
    holidays = models.ManyToManyField(StoreHoliday, blank=True)
    copy_holidays_from = models.ForeignKey('Store', blank=True, null=True)

    def save(self):
        print '====  BEFORE SAVE:', self.holidays.all()
        super(Store, self).save()
        self.copy_holidays()
        print '====  AFTER SAVE:', self.holidays.all()

    def copy_holidays(self):
        if self.pk and self.copy_holidays_from:
            self.holidays.clear()
            for h in self.copy_holidays_from.holidays.all():
                self.holidays.add( h )
Run Code Online (Sandbox Code Playgroud)

这是print声明的输出:

====  BEFORE SAVE: []
====  AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]
Run Code Online (Sandbox Code Playgroud)

有没有人对可能导致这种情况的原因有任何建议?

编辑:当通过管理界面保存时,Django似乎丢弃了save()中m2m关系的所有手动更改.这与处理表单的方式有关吗?

kb.*_*kb. 12

事实证明,上述并不是实现它的正确方法.该代码属于StoreAdmin,通过覆盖model_save().

这就是我解决它的方式:

class StoreAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if obj.copy_holidays_from:
            form.cleaned_data['holidays'] = obj.copy_holidays_from.holidays.all()

        super(StoreAdmin, self).save_model(request, obj, form, change)
Run Code Online (Sandbox Code Playgroud)