您的位置:

报错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。