您的位置:

django有ValueError("Only numeric values of degree units are allowed on ""geographic DWithin queries.")报错是怎么回事

  发布时间:2023-04-01 20:50:03
报错的原因这个错误是由于你使用了Django ORM的"DWithin"查询,并且在指定距离单位时使用了非数字值。例如如果distance是字符串的话要转换成数字如果是这样的话,你可能需要对字符串进行转换成数字类型, 如int()。总之,要检查distance是不是数字,并确保它在DWithin查询中使用的是数字,转换它如果是字符串,保证它的有效性。下面是一个示例上面代码片段中, 用获取到distance的值。然后用将distance的值转换成浮点型。之后使用此distance值作为D的参数来执行DWithin查询。

报错的原因

这个错误是由于你使用了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查询。