我遇到了一个奇怪的问题,我希望这里的人能够阐明一些问题。
我正在重写模型的 save() 方法,以便在运行 super() 后向 ManyToMany 字段添加一些值。我的问题是,当我在 Django 管理中保存时,值似乎已添加到关系中,但随后又为空。
但是,如果我从 manage.py shell
执行它,它可以正常工作。
我在其中放置了两个打印语句,无论我是通过 Django 管理还是通过 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 )
这是 print
语句的输出:
==== BEFORE SAVE: []
==== AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]
有没有人对可能导致这种情况的原因有任何建议?
编辑: 在通过管理界面保存时,Django 似乎放弃了 save() 中对 m2m 关系的所有手动更改。这与它处理表单的方式有关吗?
最佳答案
所以事实证明上面的方法不是正确的实现方式。通过覆盖 model_save(),代码属于 StoreAdmin。
我是这样解决的:
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)
关于python - 使用 Django 管理时未保存 ManyToMany 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6200233/