Python 使用django'模拟内部联接;s orm,没有显式外键
我有两个模型,小部件和案例。表之间没有明确的关系(没有外键)。这些表的内容类似于:Python 使用django'模拟内部联接;s orm,没有显式外键,python,django,orm,Python,Django,Orm,我有两个模型,小部件和案例。表之间没有明确的关系(没有外键)。这些表的内容类似于: Widgets Cases |----+--------+-------+---------| |----+------+-------+---------| | id | color | spots | stripes | | id | size | spots | stripes | |
Widgets Cases
|----+--------+-------+---------| |----+------+-------+---------|
| id | color | spots | stripes | | id | size | spots | stripes |
|----+--------+-------+---------| |----+------+-------+---------|
| 1 | blue | 2 | 6 | | 1 | s | 2 | 1 |
| 2 | blue | 3 | 10 | | 2 | m | 2 | 6 |
| 3 | blue | 2 | 1 | | 3 | l | 3 | 10 |
| 4 | green | 20 | 7 | | 4 | xl | 20 | 7 |
| 5 | purple | 3 | 10 | |----+------+-------+---------|
|----+--------+-------+---------|
我想得到所有的情况下,有相同数量的斑点和条纹作为任何一个蓝色的小部件。使用SQL,它看起来像:
SELECT Cases.id
FROM Cases
INNER JOIN Widgets
ON Cases.spots = Widgets.spots
AND Cases.stripes = Widgets.stripes
WHERE Widgets.color = 'blue';
应该返回ID:[1,2,3]
我正在尝试使用django ORM获得相同的结果。我想到的是:
selected_widgets = Widgets.objects.filter(color='blue').values('spots', 'stripes')
associated_cases = [Cases.objects.get(spots=v['spots'], stripes=v['stripes'])
for v in selected_widgets]
假设
斑点
和条纹
总是唯一地标识案例,因此.get
调用不是问题。这个解决方案似乎仍然非常低效,为每个小部件单独调用数据库,而sql只进行内部连接。是否有一种简单的方法可以在仍然使用django ORM的情况下减少对数据库的运行次数?这可能是使用.raw()
方法的最佳时机;您可以指定确切的SQL,并将结果作为对象的普通Django结果列表获取