更新Django中的多行

更新Django中的多行,django,django-models,Django,Django Models,所以我有一些模型 使用者 用户配置文件 UserJob(1-1相关名称为job) 作业(用户作业的外键) 位置(作业和用户都有一个位置) 我需要用三个查询更新用户配置文件 更新在最后一天处于活动状态且与工作地点位于同一位置的用户 更新在最后一天未处于活动状态或与其工作不在同一位置的用户UserJob关系 如果UserJob值days_missed为3,则删除UserJob 我知道我如何做到这一点,只需选择所有具有作业的用户并进行迭代,但对于X数量的用户来说,这似乎过于劳动密集。有没有一个

所以我有一些模型

  • 使用者
  • 用户配置文件
  • UserJob(1-1相关名称为job)
  • 作业(用户作业的外键)
  • 位置(作业和用户都有一个位置)
我需要用三个查询更新用户配置文件

  • 更新在最后一天处于活动状态且与工作地点位于同一位置的用户
  • 更新在最后一天未处于活动状态或与其工作不在同一位置的用户UserJob关系
  • 如果UserJob值days_missed为3,则删除UserJob
我知道我如何做到这一点,只需选择所有具有作业的用户并进行迭代,但对于X数量的用户来说,这似乎过于劳动密集。有没有一个简单的方法像使用更新。。。在哪里查询或什么的

我在想这样的事情也许吧

yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
users = User.objects.filter(
    job__isnull = False,
    location = job__job__location,
    profile__last_online__gte = yesterday
)

问题是您不能使用作业位置位的字段

我想这应该可以解决您的问题:

一次更新多个对象:

F表达式:参考WHERE子句中的模型值:


您只能更新正在更新的模型上的字段,因此您的查询必须位于
UserJob
对象上。如果没有您的模型定义,我没有确切的关系,但是这个或一些相近的关系应该可以工作:

UserJob.objects.filter(
    user__location = F('job__location'),
    user__profile__last_online__gte = yesterday
).update(
    days_worked = F('days_worked') + 1,
    points = F('points') + 1
)