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

我的问题来自于这种情况,它看起来很乱,因为我事先知道它是一个单一的对象,所以我认为可以有更适合的对象来使用(顺便说一下,它是保证存在的,整个业务逻辑取决于此),而不是做模型,如果存在,则创建表,然后搜索第一个元素。
有没有更好的方法,我不知道存储和检索一个单一的对象?谢谢!

最佳答案

既然你保证只有一个元素,你就可以执行一个.get(..)而不需要任何过滤。
在对象不存在的情况下,我们想要执行create。我们可以把这两者结合起来:

L, created = ValuesList.objects.get_or_create(
    defaults={
        'my_json': some_default
    })

根据您使用的数据库系统,这可以通过单个查询来执行。它将尝试获取单个对象(我们不需要过滤,因为它保证只有一个对象)。在不存在的情况下,Django将创建一个实例,其中以get_or_create字典中的值作为初始值。
函数返回一个2元组,其中第一个元素是对象(在这里是获取或构造的,在这里是defaults),第二个元素是一个布尔值,指示是否构造了对象(在这里是L)。
您可以将此逻辑封装在模型类(例如acreated)中,该类允许我们获取单个实例。

关于mysql - 全局单个元素的最佳数据库实践?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50678198/

10-16 07:28