gpt4 book ai didi

mysql - 全局单个元素的最佳数据库实践?

转载 作者:搜寻专家 更新时间:2023-10-30 22:26:34 25 4
gpt4 key购买 nike

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

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

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

最佳答案

既然您保证只有 一个 元素,您就可以执行 .get(..) 而无需任何过滤。

如果对象不存在,我们要执行创建。我们可以将两者结合起来 get_or_create :

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

根据您使用的数据库系统,这可以通过单个 查询来执行。它将尝试获取单个对象(我们不需要过滤,因为它保证只有一个)。如果它不存在,Django 将创建一个实例,并将 defaults 字典中的值作为初始值。

该函数返回一个二元组,第一个元素是对象(获取或构造,这里是L),第二个是一个 bool 值,表示是否构造了一个对象(这里是创建)。

您可以将此逻辑封装在允许我们获取单个实例的模型类(例如 @classmethod)中。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com