这似乎发生在MeasureBase
类的django.contrib.gis.measure
(which Distance/D继承自),更具体地说in the default_units method它尝试投射的地方str
或数字输入值float
但收到一个F
表达代替。
作为解决方法,我们可以做的是annotate
the Distance (小心这个Distance
方法,因为它来自 GeoDjango 地理数据库函数) 在。。之间shop.location_point
和当前的location_point
然后我们可以通过该距离进行过滤<=
比实例radius
:
from django.contrib.gis.db.models.functions import Distance
zone_list = Zone.objects.annotate(
distance=Distance('location_point', shop.location_point)
).filter(distance__lte=F('radius'))
感谢 @e4c5 的出色回答:GeoDjango 按距模型字段的距离进行过滤
另一种方法是消除annotation
完全部分并直接进行过滤Distance
:
from django.contrib.gis.db.models.functions import Distance
zone_list = Zone.objects.filter(
radius_gte=Distance('location_point', shop.location_point)
)
I leave this here for comment continuity:
You can try to cast the F('radius')
result as a FloatField()
using the Cast() method to turn the Integer to a Float.
zone_list = Zone.objects.filter(
location_point__distance_lte=(
shop.location_point,
D(m=Cast('radius', output_field=models.FloatField()))
)
)