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()
Вернуться на верх