【发布时间】:2019-04-19 23:32:45
【问题描述】:
我有两个 Django 模型(A 和 B),它们没有任何外键关联,但都有一个几何字段。
class A(Model):
position = PointField(geography=True)
class B(Model):
position = PointField(geography=True)
我想在空间上关联它们,即给定 A 的查询集,能够获得 B 的查询集,其中包含与 A 的距离小于给定距离的那些记录。
我还没有找到使用纯 Django 的 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
是否有人知道执行此类查询的更好方法(更有效)或者我的代码失败的原因?
非常感谢。
【问题讨论】:
标签: python django postgis django-orm geodjango