如何避免在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)
该机构出错“该字段是必填的”。
- 我试图反序列化保存的对象,但它是类型的发电机,而不是类型模型实例因此得到了错误
'generator' object has no attribute 'id
'DeserializedObject' object has no attribute 'id'
和当试图得到id属性。
什么是最好的方式来检索和存储研究所模式实例只有一次,并使用它的eveytime作为外键没有击中数据库?
答
这会有所帮助。
Models.objects.filter().select_related('foreign_key1','foreign_key2')
您基本上想要在提取学生模型时获取学院模型。这可以使用Django的'select_related'。看看这个链接:https://stackoverflow.com/questions/31237042/whats-the-difference-between-select-related-and-prefetch-related-in-django-orm –