在Django中匹配不同表中的字段
我有两个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._meta
和 NewModel._meta
中的信息,这样可以避免硬编码字段和表的名称。
2
这段代码的意思是:我们要从一个叫做`NewModel`的模型中筛选出一些数据,这些数据的名字要在另一个叫做`OldModel`的模型中找到。具体来说,它会从`OldModel`中获取所有名字,然后在`NewModel`中找出那些名字相同的记录。
这样做会让数据库执行一个“折叠”的查询,也就是说,它会把多个查询合并成一个。想要查看这个查询的原始SQL语句,可以输入 print new_models.query
。