添加多对多对象以在Django中的save()方法内部进行建模

时间:2014-07-18 11:53:13

标签: django django-models

我已经在模型上覆盖了我的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

3 个答案:

答案 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()在某些地方使用它们。