【发布时间】:2011-09-06 05:06:36
【问题描述】:
我遇到了一个奇怪的问题,希望这里的人能够解释一下。
我正在重写模型的 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 )
这是print 语句的输出:
==== BEFORE SAVE: []
==== AFTER SAVE: [<StoreHoliday: 10 Mar 2010, Chuck Norris birthday (Closed)>]
有人对可能导致此问题的原因有任何建议吗?
编辑: 在通过管理界面保存时,Django 似乎放弃了 save() 中对 m2m 关系的所有手动更改。这与它处理表单的方式有关吗?
【问题讨论】:
-
我不知道你的问题出在哪里,但是
self.holidays = self.copy_holidays_from.holidays.all()看起来比清除和迭代要好得多。 -
感谢您的提示,我不知道这是可能的。你可以在下面看到我做错了什么。
标签: python django m2m django-orm