如何避免在Django中每次需要外键都要打DB

问题描述:

我以学院用户的身份登录到我的应用程序,并且必须保存学生的详细信息。 学生模型有一列作为FK到学院模型。如何避免在Django中每次需要外键都要打DB

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

我每次注册学生时,都必须打开数据库才能获得学院实例并在保存学生细节时使用它。在做其他事情时,这种数据库触发的情况在许多地方出现。

为了避免撞上DB每次我试图做的事情如下:
从数据库获取机构实例在登录时和
1.将其转换为使用model_to_dict快译通(因为需要系列化问题单独处理日期)和在会话中存储。
2.使用django的序列化框架序列化它并存储在会话中。

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

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

该机构出错“该字段是必填的”。

  1. 我试图反序列化保存的对象,但它是类型的发电机,而不是类型模型实例因此得到了错误'generator' object has no attribute 'id'DeserializedObject' object has no attribute 'id'和当试图得到id属性。
  2. 什么是最好的方式来检索和存储研究所模式实例只有一次,并使用它的eveytime作为外键没有击中数据库?

开始=“2”>
+1

您基本上想要在提取学生模型时获取学院模型。这可以使用Django的'select_related'。看看这个链接:https://stackoverflow.com/questions/31237042/whats-the-difference-between-select-related-and-prefetch-related-in-django-orm –

这会有所帮助。

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