您的位置:

django有ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,))报错是怎么回事

  发布时间:2023-02-28 19:00:49
你可以在官方文档中查看更多信息你还可以在 PostGIS 的文档中查看更多信息希望这些信息对你有帮助。为了解决这个问题,你可以使用 PostGIS 的 geography 类型支持的函数或操作符。例如,你可以使用 __distance_lte 操作符代替 __distance_lt 操作符,如下所示如果你使用的是不支持的操作符,也同样可以使用支持的操作符代替。你也可以查看其他资源,了解如何使用 Django ORM 和 PostGIS 进行地理数据处理。

报错的原因

ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 这个错误通常是由于在 Django ORM 中使用了不支持的函数或操作符导致的。

这个错误通常会在使用 PostGIS 的 geography 类型时出现。PostGIS 的 geography 类型不支持所有的函数和操作符,因此如果尝试使用不支持的函数或操作符,则会出现这个错误。

为了解决这个问题,你需要检查你的代码中使用的函数和操作符,确保它们是 PostGIS 的 geography 类型所支持的。

例如,假设你的模型如下所示:


class Location(models.Model):
    name = models.CharField(max_length=50)
    point = models.PointField(geography=True)

如果你在查询中使用了不支持的函数或操作符,则会出现 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误。

例如,如果你使用了不支持的函数,如下所示:


locations = Location.objects.filter(point__distance_lte=(point, D(km=10)))

则会出现 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误。

为了解决这个问题,你需要使用支持的函数或操作符。例如,你可以使用 dwithin 函数来替换 distance_lte 函数,如下所示:


locations = Location.objects.filter(point__dwithin=(point, D(

对了,为了解决 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误,你还可以使用 PostGIS 的 geography 类型支持的其他函数和操作符。例如,你可以使用以下函数:

- distance

- dwithin

- intersects

你也可以使用以下操作符:

- __contained

- __contains

- __distance_gt

- __distance_gte

- __distance_lt

- __distance_lte

- __intersects

请注意,这只是 PostGIS 的 geography 类型支持的一部分函数和操作符。你可以在官方文档中查看更多信息:https://docs.djangopro对了,为了解决 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误,你还可以使用 PostGIS 的 geography 类型支持的其他函数和操作符。例如,你可以使用以下函数:

- distance

- dwithin

- intersects

你也可以使用以下操作符:

- __contained

- __contains

- __distance_gt

- __distance_gte

- __distance_lt

- __distance_lte

- __intersects

请注意,这只是 PostGIS 的 geography 类型支持的一部分函数和操作符。你可以在官方文档中查看更多信息:https://docs.djangoproject.com/en/3.1/ref/contrib/gis/db-api/#geography-functions

你还可以在 PostGIS 的文档中查看更多信息:https://postgis.net/docs/reference.html#Geography_Functions

希望这些信息对你有帮助。

如何解决

如果你遇到了 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误,你可以按照以下步骤解决:

1. 检查你在 Django ORM 中使用的函数或操作符是否是 PostGIS 的 geography 类型支持的。

2. 如果你使用的函数或操作符不是 PostGIS 的 geography 类型支持的,请使用支持的函数或操作符代替。

例如,假设你有如下的模型:


class Location(models.Model):
    name = models.CharField(max_length=50)
    point = models.PointField(geography=True)

如果你在查询中使用了不支持的函数,则会出现 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误。

例如,如果你使用了不支持的函数,如下所示:


locations = Location.objects.filter(point__distance_lte=(point, D(km=10)))

则会出现 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误。

为了解决这个问题,你可以使用 PostGIS 的 geography 类型支持的函数或操作符。例如,你可以使用 dwithin 函数代替 distance_lte 函数,如下所示:


locations = Location.objects.filter(point__dwithin=(point, D(km=10)))

这样就可以解决 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误了。

如果你使用的是不支持的操作符,也同样可以使用支持的操作符代替。例如,你可以使用 __distance_lte 操作符代替 __distance_lt 操作符,如下所示:


locations = Location.objects.filter(point__distance_lte=(point, D(km=10)))

如果你使用的是不支持的操作符,也同样可以使用支持的操作符代替。例如,你可以使用 __distance_lte 操作符代替 __distance_lt 操作符,如下所示:


locations = Location.objects.filter(point__distance_lte=(point, D(km=10)))

这样就可以解决 ValueError('PostGIS geography does not support the "%s" '"function/operator." % (self.func or self.op,)) 错误了。

如果你还是不确定如何解决这个问题,你可以尝试查看 Django 和 PostGIS 的文档,了解哪些函数和操作符是支持的。你也可以查看其他资源,了解如何使用 Django ORM 和 PostGIS 进行地理数据处理。

希望这些信息对你有帮助。

使用例子

是的,下面是一个示例:

假设你有如下的模型:


class Location(models.Model):
    name = models.CharField(max_length=50)
    point = models.PointField(geography=True)

如果你想查询距离某个点不超过 10 公里的位置,你可以使用 dwithin 函数,如下所示:


from django.contrib.gis.measure import D
point = Point(x=1, y=1)
locations = Location.objects.filter(point__dwithin=(point, D(km=10)))

如果你想查询距离某个点大于 10 公里的位置,你可以使用 __distance_gt 操作符,如下所示:


from django.contrib.gis.measure import D
point = Point(x=1, y=1)
locations = Location.objects.filter(point__distance_gt=(point, D(km=10)))

如果你想查询距离某个点大于等于 10 公里且小于 20 公里的位置,你可以使用 __distance_gte 和 __distance_lt 操作符,如下所示:


from django.contrib.gis.measure import D
point = Point(x=1, y=1)
locations = Location.objects.filter(point__distance_gte=(point, D(km=10)), point__distance_lt=(point, D(km=20)))

如果你想查询距离某个点小于等于 20 公里且大于等于 10 公里的位置,你可以使用 __distance_lte 和 __distance_gte 操作符,如下所示:


from django.contrib.gis.measure import D
point = Point(x=1, y=1)
locations = Location.objects.filter(point__distance_lte=(point, D(km=20)), point__distance_gte=(point, D(km=10)))

如果你想查询与某个点距离在 10 公里以内的位置,你可以使用 __dwithin 操作符,如下所示:


from django.contrib.gis.measure import D
point = Point(x=1, y=1)
locations = Location.objects.filter(point__dwithin=(point, D(km=10)))

希望这些示例能帮助你理解如何使用 Django ORM 和 PostGIS 进行地理数据处理。