我已经在模型上覆盖了我的save()
方法,以便向其添加一些ManyToMany对象。如果在添加对象后调用super().save()
方法,我会在添加ManyToMany对象之前得到模型需要PK的经典错误,这是正常的。但是,如果我在之前和之后都调用它,那么对象就不会被添加。
我的代码如下所示:
def save(self, force_insert=False, force_update=False):
super(Teacher, self).save(force_insert, force_update)
from school.models import Course
disciplinary = Course.objects.filter(type=Course.TYPE_DISCIPLINARY)
for disc in disciplinary:
print disc # this gets called
self.subjects.add(disc)
super(Teacher, self).save(force_insert, force_update)
这不会产生任何错误,但不会添加适当的Course
。
答案 0 :(得分:2)
如果您正在使用Django管理员,那么在保存您的父对象时,管理员将首先在您的模型实例上调用save()
,然后它将添加在管理员中提交的m2m对象表单...管理表单中选择的任何内容将替换您在重写的save
方法中添加的对象。
答案 1 :(得分:0)
看到你只添加一个静态课程集,你可以使用post_save信号 Django signals post save signal
如果不是问题,只需添加新功能并在保存后调用
Teacher.save()
Teacher.save_courses()
我个人不知道如何在保存功能中使用它,但我可能错了。
答案 2 :(得分:0)
我最终做的是延迟添加课程,使用Celery(我在这个项目中使用的是),5秒钟,此时DB应该是一致的,一切都应该可供我使用
更可靠的解决方案是仅将Celery任务延迟少量(<1秒),并且如果该条目尚未存在于DB中则重新安排它。 (似乎Django不会立即在数据库中保留模型,而是对它们进行缓存,以便您可以get()
在某些地方使用它们。