У меня есть две модели Django (A и B), которые не связаны каким-либо внешним ключом, но обе имеют геометрическое поле.
class A(Model):
position = PointField(geography=True)
class B(Model):
position = PointField(geography=True)
Я хотел бы связать их пространственно, т. Е. Учитывая набор запросов A, чтобы иметь возможность получить набор запросов B, содержащий те записи, которые находятся на расстоянии менее заданного расстояния до A.
Я не нашел способа использовать ORM чистого Джанго для такой вещи.
Конечно, я мог бы написать свойство в A, например:
@property
def nearby(self):
return B.objects.filter(position__dwithin=(self.position, 0.1))
Но это позволяет мне выбирать соседние записи в каждом экземпляре, а не в одном запросе, что далеко от эффективности.
Я также пытался сделать это:
nearby = B.objects.filter(position__dwithin=(OuterRef('position'), 0.1))
query = A.objects.annotate(nearby=Subquery(nearby.values('pk')))
list(query) # error here
Однако я получаю эту ошибку для последней строки:
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery
Кто-нибудь знает лучший (более эффективный) способ выполнения такого запроса или, возможно, причину сбоя моего кода?
Я очень ценю.