python - Django ORM - 不同表中行的部分匹配

标签 python django postgresql orm model

我有两个不同的 Django 模型,“modelA”和“modelB”,它们只有两列彼此相同:“EMAIL”和“NAME”,每个模型中的其余列是不同的。我想从“modelA”返回一个对象列表,但在“modelB”中不包含重复的“EMAIL”和“NAME”组合...

例如,如果“modelA”有以下对象:

EMAIL             NAME       SOMEFIELD
bob@email.com     Bob        ....
bob@email.com     Robert     ....

和“modelB”有对象:

EMAIL             NAME       ADIFFERENTFIELD
bob@email.com     Bob        ....
sammy@email.com   Sam        ....
bob@email.com     Bobby      ....

我希望最终的“modelA”查询集只返回:

EMAIL             NAME       SOMEFIELD
bob@email.com     Robert     ....

做这个 Django 最有效的方法是什么?我现在能想到的最佳解决方案是获取“modelA”查询集并遍历每个对象以测试“modelB”中是否存在相同的“EMAIL”和“NAME”组合,如果不存在,则添加该对象到一个新列表。这听起来非常低效。尽管我对 Django 的经验很少,但我知道一定有更好的方法 :) 如果相关,我的数据库正在使用 PostgreSQL。提前致谢。

最佳答案

您只需两个查询即可完成此操作:

from django.db.models import Q

b_models = modelB.objects.values('email', 'name')
exclude = Q()
for model in b_models:
    exclude |= (Q(email=model['email']) & Q(name=model['name']))

a_models = modelA.objects.exclude(exclude)

Q 对象允许将过滤器与简单的二元运算符(&|~ 用于 SQL ANDORNOT)。这将排除模型 B 表中已存在的任何一对电子邮件和名称。

如果您要按单个属性(比如电子邮件)进行过滤,您可以:

emails = modelB.objects.values_list('email', flat=True)
a_models = modelA.objects.exclude(email__in=emails)

那只会执行一个查询。

关于python - Django ORM - 不同表中行的部分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18217027/

相关文章:

python - 如何在 Django ORM 查询中包含空结果

ruby-on-rails - 保留作业时出错:PG::ConnectionBad: PQconsumeInput() 服务器意外关闭了连接

c# - 将 dapper 与 .net 核心一起使用时,对象必须实现 IConvertible 异常

python - 两种方式去除重复的开始和结束节点

python - 如何验证通过 Telegram 的 Web 应用程序收到的数据

python - 如何使用 subprocess.call 让计算机进入休眠状态?

javascript - html 发布形式不同的目的地

django - 我应该将 docker-compose 创建的/data 文件夹包含到 Git 中吗?

python list max() 方法只返回 3 位数字?

java - 如何向 Postgresql CopyManager 指示 session 实例