django有ValueError("Only numeric values of degree units are allowed on ""geographic DWithin queries.")报错是怎么回事
报错的原因
这个错误是由于你使用了Django ORM的"DWithin"查询,并且在指定距离单位时使用了非数字值。Django ORM只允许使用数字值来指定距离单位(如米或千米)。请检查你的代码,确保使用的是正确的数字值。
如何解决
解决这个问题的方法是检查查询中使用的距离值并确保它是数字。具体来说,您应该确保您在使用DWithin查询时传递给它的distance参数是一个数字而不是字符串或其他类型。例如,
if your distance is stored in a variable named distance.
distance = 10
#correct
YourModel.objects.filter(location__distance_lt=(point, D(m=distance))
#wrong
YourModel.objects.filter(location__distance_lt=(point, D(m='10'))
如果distance是字符串的话要转换成数字
distance = '10'
distance = int(distance)
YourModel.objects.filter(location__distance_lt=(point, D(m=distance))
如果是这样的话,你可能需要对字符串进行转换成数字类型, 如int()。此外,如果该值来自用户输入,您还应该进行数据验证以确保它是有效的数字。
总之,要检查distance是不是数字,并确保它在DWithin查询中使用的是数字,转换它如果是字符串,保证它的有效性。
使用例子
是的,有。下面是一个示例:
from django.contrib.gis.measure import D
from myapp.models import MyModel
# Get the distance value from a form or somewhere else
distance = request.GET.get('distance')
# Verify that distance is a valid number
if not distance.isnumeric():
raise ValueError("Distance must be a number.")
# Convert distance to a float
distance = float(distance)
# Create a point to use as the reference point
point = ...
# Perform the DWithin query
results = MyModel.objects.filter(location__distance_lt=(point, D(m=distance)))
上面代码片段中, 用distance=request.GET.get('distance')获取到distance的值。之后用if not distance.isnumeric()判断它是不是数字,如果不是就抛出错误。然后用distance = float(distance)将distance的值转换成浮点型。之后使用此distance值作为D(m=distance)的参数来执行DWithin查询。