Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用django'模拟内部联接;s orm,没有显式外键_Python_Django_Orm - Fatal编程技术网

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结果列表获取