这似乎内部发生MeasureBase
类django.contrib.gis.measure
(其Distance
/D
从继承),更具体的default_units
方法,其中它试图铸造str
或数字输入值float
而接收F
表达式来代替。
我们可以做一个解决办法,就是annotate
在Distance
(之间)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)
)
我在此保留评论的连续性:
您可以尝试投的
F('radius')
结果作为
FloatField()
使用
Cast()
方法打开整数为float。
zone_list = Zone.objects.filter(
location_point__distance_lte=(
shop.location_point,
D(m=Cast('radius', output_field=models.FloatField()))
)
)