我有两个完全不相关的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最快,最有效的方法是什么?
答案 0 :(得分: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
中的信息,这样您就不会对字段和表名进行硬编码。
答案 1 :(得分:1)
new_models = NewModel.objects.filter(
name__in=OldModel.objects.all().values_list('name', flat=True)
)
这将导致折叠选择查询到数据库。要查看原始sql查询,只需键入print new_models.query
。