python - 使用 Django 管理时未保存 ManyToMany 字段

标签 python django m2m django-orm

我遇到了一个奇怪的问题,我希望这里的人能够阐明一些问题。

我正在重写模型的 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/

相关文章:

python - 解析 HTML Python、BeautifulSoup

python - 使用 open cv 和 python 更改图像标题以同时显示多个图像

Python Django(守护者): editing data depending on an m2m-field in my model

python - 遵循教程后的 m2m django 实现

python - Keras - 将函数式 API 模型连接在一起

django - 如何将可排序的计数列添加到具有多对一关系的模型的 Django 管理中?

django - 实现与 PREPEND_WWW 相反的效果的最佳方法(例如从 "www"重定向到根域)?

python - 如何合并两个 django 数据库?

Django 信号 m2m_changed 未触发

python - Pandas 创建完美的面板数据,根据条件附加空行