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)
归档时间: |
|
查看次数: |
5441 次 |
最近记录: |