考虑到我有1000个用户,这些用户与"公司"的多对多关系中使用.

现在,我希望从公司列表中删除所有"不活跃"的用户(这是大多数).

我可以用remove的技巧:

for user in User.filter(active=False):
    Company.customers.remove(user)

然而,这也会做1000 s的数据库命中,使它真的很慢.有没有办法让我在Django 里做到这一点?不go rawsql?

推荐答案

删除bulk个元素:

Company.customers.remove(*User.objects.filter(active=False))

这将产生两个查询:一个是获取User个对象的主键(或ManyToManyField引用的字段),然后在bulk中删除所有这些元素.

如果要为all Company s执行此操作,可以使用用途:

# 🖟 reference to the Company model
Company.customers.through.objects.filter(user__active=False).delete()

如果我们想使用特定的Company,我们还可以使用以下方法来限制查询的数量:

# 🖟 reference to the Company model
Company.customers.through.objects.filter(
    company=some_company, user__active=False
).delete()

Django相关问答推荐

Django mods.py我想要一个函数转到一个变量

Django:不能在子函数中返回重定向异常.第一个功能继续

Django中每个类型/代理的最新行

在Django ORM中引用非主外键

如何在Django REST框架中实现ForeignKey搜索

如何在Django模板中有条件地传递值给with变量?

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

从一个组中获取所有用户 - Django

防止 Django 从表单集中保存特定表单

Django:在模板中呈现表单字段时添加 CSS 类

django类型对象Http404没有属性get

AngularJS + Django Rest Framework + CORS(CSRF Coo​​kie 没有出现在客户端)

在 django 中的查询集上运行 explain的简单方法

有 Django List View 模型排序吗?

Django 和 VirtualEnv 开发/部署最佳实践

如何找到两个 Django 查询集的交集?

Django 发送邮箱

模型表格Save保存,Get获取保存的对象

django-getlist()

它是如何工作的,Django INSTALLED_APPS 的命名约定?