在Django中匹配不同表中的字段

0 投票
2 回答
542 浏览
提问于 2025-04-18 11:32

我有两个Django模型,它们之间没有任何关系。大概是这样的:

class OldModel(models.Model):
    name = models.CharField(max_length=100)

class NewModel(models.Model):
    name = models.CharField(max_length=100)

这两个模型都有很多记录。我想从NewModel中筛选出那些名字和OldModel中的某条记录相同的记录。用Django的ORM,有什么最快、最有效的方法来做到这一点呢?

2 个回答

1

我只想到一个叫做 name__in 的查找方式,它是用一个简单的值列表来调用的。

old_models = OldModel.objects.all()
old_model_names = old_models.values_list('name', flat=True)
new_models = NewModel.objects.filter(name__in=old_model_names)

这个应该转换成类似下面这样的SQL查询。

SELECT * FROM newmodel WHERE name in (SELECT name from oldmodel);

另外,你可以考虑使用 extra 语句,这样可以创建一个优化过的查询版本。

请查看这里的文档。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra

你应该使用 where / tables 这部分内容。但这确实不是原始的Django ORM。

为了得到更准确的SQL查询,可以使用 OldModel._metaNewModel._meta 中的信息,这样可以避免硬编码字段和表的名称。

2

这段代码的意思是:我们要从一个叫做`NewModel`的模型中筛选出一些数据,这些数据的名字要在另一个叫做`OldModel`的模型中找到。具体来说,它会从`OldModel`中获取所有名字,然后在`NewModel`中找出那些名字相同的记录。

这样做会让数据库执行一个“折叠”的查询,也就是说,它会把多个查询合并成一个。想要查看这个查询的原始SQL语句,可以输入 print new_models.query

撰写回答