首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在设置Django模型的字段之前应该检查一下吗?

问在设置Django模型的字段之前应该检查一下吗?
EN

Stack Overflow用户
提问于 2020-02-20 07:57:02
回答 1查看 30关注 0票数 0

我有一个后台服务,可以导入django,并直接使用我的django项目的ORM。

它在一个循环中监控一些东西,经常--每隔几秒钟。它检查我的数据库中的每个用户,检查一个条件,并在此基础上设置一个标志为True或False。我的数据库中可能有数千个用户,所以这里的效率可以加起来。

代码语言:javascript
复制
while True:
    time.sleep(5)
    for user in User.objects.all():
        if user.check():
            user.flag = True
        else:
            user.flag = False
        user.save()

我使用MySQL作为我的数据库。

我好奇的是:如果某个特定用户将.flag设置为True,我是否会在每次运行user.flag = True; user.save()时都执行磁盘写操作,即使没有任何更改?或者Django或MySQL是否足够聪明,在没有任何变化的情况下不进行磁盘写入?

我假设MySQL读操作比写操作开销更低。检查user.flag的值,并仅在值实际更改时才尝试设置user.flag是否更有意义?根据我的理解,这本质上是将数据库读取交换为数据库写入(除了实际发生变化的情况,在这种情况下,首先执行读取,然后执行写入)。

注意:这只是一个基本的例子。我实际上并不是在和用户打交道。

EN

回答 1

Stack Overflow用户

发布于 2020-02-20 10:24:51

如果可以将check的逻辑移到.filter()子句中,那将是最好的。这样你就可以做到:

代码语言:javascript
复制
User.objects.filter(match_check, flag=False).update(flag=True)
User.objects.filter(~Q(match_check), flag=True).update(flag=False)

或者,如果您可以对该值进行注释:

代码语言:javascript
复制
User.objects.annotate(
    new_flag=some_check,
).exclude(flag=F('new_flag')).update(flag= ('new_flag'))

否则,如果您不能,那么可以这样做:

代码语言:javascript
复制
new_flag = user.check()
if new_flag != user.flag:
    user.flag = new_flag
    user.save(update_fields=['flag']) # This will only update that single column.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60311048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档