如何在Django中每次需要外键时避免命中DB

时间:2017-10-15 07:23:44

标签: python django serialization

我以学院用户身份登录我的应用程序,我必须保存学生详细信息。 学生模型有一个列作为FK到学院模型。

institute = models.ForeignKey('institute.InstituteDetailsModel', to_field="sys_id", on_delete = models.SET_NULL, null=True, blank=True)

每次我注册学生时,我都必须点击数据库以获取学院实例并在保存学生详细信息时使用它。在做其他事情时,许多地方都会出现这种数据库攻击情况。

为了避免每次我尝试做以下事情时击中DB:
在登录时从数据库获取学院实例和
1.使用model_to_dict将其转换为dict(由于序列化问题,日期需要单独处理)并存储在会话中。
2.使用django的序列化框架序列化它并存储在会话中。

但我分别在上述方法中遇到以下问题:
1.使用ModelForms保存数据。

data["institute_id"] = request.session["institute"]["id"]
form = StudentForm(data)

为学院收到错误“此字段是必需的”。

  1. 我尝试反序列化已保存的对象,但它是类型生成器而不是类型模型实例,因此在尝试获取id属性时出现错误'generator' object has no attribute 'id'DeserializedObject' object has no attribute 'id'
  2. 只检索和存储机构模式实例一次的最佳方法是什么,并将eveytime用作外键而不用DB?

1 个答案:

答案 0 :(得分:0)

这会有所帮助。

    Models.objects.filter().select_related('foreign_key1','foreign_key2')