全球单一元素的最佳数据库实践?

时间:2018-06-04 10:13:14

标签: mysql django database

我最近开发了一个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)

我的问题来自那种情况,它看起来很乱,因为我事先知道它是一个单一的对象,所以我想可能有一些更适合用于对象(顺便提一下,这是保证存在,整个业务逻辑依赖于此而不是做模型,创建表,然后搜索第一个元素(如果存在)。

我不知道存储和检索单个对象的更好方法吗?谢谢!

1 个答案:

答案 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)。

相关问题