我有两种模式:
Model_A that contains a GeoDjango Point;
Model_B that contains a GeoDjnago MultiPololygon;
对于Model_A中的每个元素,我必须检查该点是否包含在Model_B元素的某个m_polygon中;
我能够进行这个简单的查询。
但我也想过: 我在Model_A中有很多元素,Model_B中有很少的元素。 因此,迭代Model_B中的所有元素并检查Model_A中是否存在包含在当前Model_B元素中的某个元素可能更有效。
那么,有没有办法制作这个GeoDjango查询?
这样的事情:
Model_A.objects.filter(*point_is_contained_into*=a_model_b_mpolygon);
------------------编辑-----------------
我试着用这个:
result = Model_A.objects.filter(position__intersects=a_model_b_mpolygon)
这对我有用。 在我的情况下是否有使用此类查询的禁忌症?
答案 0 :(得分:0)
从Django 1.11版开始,您有一个优化的选项来解决此查询。
<强>假设:强>
Model_A
有一个名为model_a_point
的几何字段。Model_B
有一个名为model_b_poly
的几何字段。使用的方法:
Subquery()
,Django 1.11中的新方法,允许使用子查询部分定义查询。
OuterRef()
,Django 1.11中使用的新方法:
当子查询中的查询集需要从外部引用字段时 查询。
within()
,其中:
测试几何字段是否在查找几何体中空间上。
annotate()
,它将为查询集中的每个项生成一个新字段(在我们的示例中,它将包含多边形包含的点。)
<强>查询:强>
Model_B.objects.annotate(
contained_points=Subquery(
Model_A.objects.filter(
model_a_point__within=OuterRef('model_b_poly')
) # Ref: 1, referenced below, keep reading
)
)
结果等等:
上面的查询将为contained_points
中的每个多边形都有一个字段Model_B
,其中包含此多边形所包含的Model_A
中的每个点。
如果您只想保留这些点的几何字段(lon, lan
),请在Subquery
调用(参考:1)的末尾使用values()
方法。