Geodjango Фильтр пересечений многоугольников для каждой точки
Я пытался получить местоположения (полигон) с магазинами (точка). Я не хочу добавлять ссылку на внешний ключ для местоположения в модель магазина, скорее я хочу получить их, проверяя их пересечения.
class Shop(models.Model):
name = models.CharField(max_length=40)
location = PointField()
@property
def point(self):
return self.location.wkt
class Location(models.Model):
name = models.CharField(max_length=200)
area = PolygonField()
Я получаю желаемые наборы запросов с помощью цикла for, однако я искал подход, связанный с базой данных.
for i in Location.objects.all():
print(Shop.objects.filter(location__intersects = i.area))
## output:
<QuerySet [<Shop: Shop object (1)>, <Shop: Shop object (2)>, <Shop: Shop object (4)>]>
<QuerySet [<Shop: Shop object (3)>]>
поэтому я попробовал использовать подзапрос, но итерация над полным набором Location queryset возвращает ошибку more than one row returned
. поэтому я установил ограничение на 1.
loc=Location.objects.all()
shp=Shop.objects.filter(location__intersects=Subquery(loc.values('area')[:1]))
Однако мне нужно отфильтровать Shop
для всех Location
. Что может быть лучшим способом сделать это?
получил желаемый результат, следуя этому ответу. Пришлось немного модифицировать.
Shop.objects.annotate(
contained_points=
Location.objects.values('area').filter(
area__intersects=OuterRef('location')
)[:1],
).values()