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

2024-10-05 14:24:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个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最快、最有效的方法是什么?你知道吗


Tags: django方法name模型名称modelmodels记录
2条回答

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

这将导致对数据库的select查询被折叠。要查看原始sql查询,只需键入print new_models.query。你知道吗

我只能考虑用平面值列表调用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的信息,这将允许您不硬编码字段和表名称。你知道吗

相关问题 更多 >