class Location(models.Model):
coordinates = models.PointField()
class Boundary(models.Model):
geom = models.MultiPolygonField()
我想查询每个位置并包含其包含边界。边界不会重叠,因此每个位置都恰好包含在一个边界中。
我的SQL查询看起来像这样:
SELECT *
FROM
Location l
INNER JOIN Boundary b on ST_CONTAINS(b.geom, l.coordinates)
我想避免单独迭代我的边界,例如:
for boundary in Boundary.objects.all():
Location.objects.filter(coordinates__within=boundary.geom)
似乎是一个明显的用例,但我还没有看到任何解决方案。
根据 Django 文档中的示例使用子查询解决了它。
from django.db.models import OuterRef, Subquery
sq = Boundary.objects.filter(geom__contains=OuterRef("coordinates"))
points = Location.objects.annotate(boundary=Subquery(sq).values("pk"))