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

时间:2014-06-30 07:05:28

标签: python django django-models orm

我有两个完全不相关的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 个答案:

答案 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._metaNewModel._meta中的信息,这样您就不会对字段和表名进行硬编码。

答案 1 :(得分:1)

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

这将导致折叠选择查询到数据库。要查看原始sql查询,只需键入print new_models.query