我最近开发了一个Django应用程序(使用MySQL),它全局依赖于一个不断变化的值列表。我将它们保存在类似
的JSON字段上{'value1':0.123, 'value2':2.33214, ...}
我使用一个24/7运行的cron作业,它在开始时检索一次该对象,然后每秒更新一次。为此,我做了类似
的事情L = ValuesList.objects.all().first()
if L is None:
L = ValuesList.objects.create(my_json=some_default)
每当我想要获取值时,这个代码就会存在。如果那看起来很糟糕,我甚至习惯了
try:
L = ValuesList.objects.get(id=1)
catch:
L = ValuesList.objects.create(my_json=some_default)
我的问题来自那种情况,它看起来很乱,因为我事先知道它是一个单一的对象,所以我想可能有一些更适合用于对象(顺便提一下,这是保证存在,整个业务逻辑依赖于此而不是做模型,创建表,然后搜索第一个元素(如果存在)。
我不知道存储和检索单个对象的更好方法吗?谢谢!
答案 0 :(得分:2)
好吧,因为您保证只有一个元素,您可以执行.get(..)
而无需任何过滤。
如果对象不存在,我们想要执行create
。我们可以将两者合并为get_or_create
:
L, created = ValuesList.objects.get_or_create(
defaults={
'my_json': some_default
})
根据您使用的数据库系统,可以使用单个查询执行此操作。它将尝试获取单个对象(我们不需要过滤,因为它保证只有一个)。如果它不存在,Django将创建一个实例,并将defaults
字典中的值作为初始值。
该函数返回一个2元组,其中第一个元素是对象(获取或构造,此处为L
),第二个元素是一个布尔值,表示对象是否构造(此处为created
)
您可以将此逻辑封装在允许我们获取单个实例的模型类中(例如@classmethod
)。