我有一个对象模型,必须在客户端用户给出的每个答案上调用。但问题是每当用户点击答案时,我的视图就会运行,对象会再次初始化,而不应该。所以我想在另一个单独的视图中在会话中创建对象实例,并在任何视图中一次又一次地重复使用相同的实例。
但它让我觉得这个:
public class EpisodeModel
{
[Key]
public int Id { get; set; }
public string Title { get; set; }
public virtual EpisodePatientModel EpisodePatient { get; set; }
}
public class EpisodePatientModel
{
public string Name { get; set; }
[Key, ForeignKey("Episode")]
public int EpisodeId { get; set; }
public virtual EpisodeModel Episode { get; set; }
}
我需要有关如何使用django在会话中创建实例的帮助。
答案 0 :(得分:1)
django中的会话不存储在服务器内存中,因此它们不能包含纯对象。它们被序列化为字符串,可以存储在一些存储后端(数据库,缓存,用户cookie等)中。
默认情况下,django使用JSON序列化程序进行会话。 JSON Serializer无法对对象进行序列化。
django内置了另一个序列化程序:pickle。它几乎可以序列化你在python中创建的任何东西,但它有一些缺点。它速度较慢,并且与任何不受信任的会话存储(例如cookie)一起使用时,它可能会成为非常严重的安全漏洞,因为它会允许攻击者运行任何代码,只需交换序列化数据。有关详细信息,请参阅Django docs。
此外,反序列化的pickle将尝试从序列化时重新创建对象状态。这个对象不会被保留在内存中,所以考虑从pickle反序列化它是否比从头重新创建它更好(就像你之前做过的那样)。