报错NotSupportedError("This backend does not support expressions for specifying ""distance in the dwithin lookup.")的解决
发布时间:2023-04-03 09:19:34
报错的原因这个错误是由于Django在使用`dwithin`这个查询参数时,后端数据库不支持在查询中使用表达式来指定距离,导致的。如果相关的项目是Django的GIS应用,建议使用应用。使用例子以下是一个使用 `distance_lt` 查询参数的例子其中x,y,d 是你需要设置的坐标与距离以下是一个使用 `PostGIS` 的例子这里的x,y,d 同上,你需要设置坐标与距离,然后使用 `__dwithin`来进行查询。注意,你需要在本地安装并配置PostGIS。
报错的原因
这个错误是由于Django在使用`dwithin`这个查询参数时,后端数据库不支持在查询中使用表达式来指定距离,导致的。
需要更换另一种查询方式或使用支持表达式的后端数据库。
如何解决
解决方案有两种:
1. 使用不需要使用表达式指定距离的查询参数,例如`distance_lt`, `distance_gte`等。
2. 使用支持表达式的后端数据库,如 PostgreSQL 和 SpatiaLite。
如果相关的项目是Django的GIS应用,建议使用 PostgreSQL+PostGIS 应用。 同时在Django中选用 `django.contrib.gis.db.backends.postgis `作为数据库后端。
使用例子
以下是一个使用 `distance_lt` 查询参数的例子:
from django.contrib.gis.geos import Point
from myapp.models import Place
location = Point(x, y)
places = Place.objects.filter(location__distance_lt=(location, d))
其中x,y,d 是你需要设置的坐标与距离
以下是一个使用 `PostGIS` 的例子:
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
# models.py
from django.contrib.gis.db import models
class Place(models.Model):
location = models.PointField()
objects = models.GeoManager()
# views.py
from django.contrib.gis.geos import Point
from myapp.models import Place
location = Point(x, y)
places = Place.objects.filter(location__dwithin=(location, d))
这里的x,y,d 同上,你需要设置坐标与距离,然后使用 `__dwithin`来进行查询。
注意,你需要在本地安装并配置PostGIS。