gpt4 book ai didi

python - Django用动态半径过滤位置距离

转载 作者:行者123 更新时间:2023-12-01 07:09:11 27 4
gpt4 key购买 nike

我在 django 的一个区域和一个商店中有 2 个模型,模型是这样的:

from django.contrib.gis.db import models
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import D
from location_field.models.spatial import LocationField


class Zone(models.Model):
name = models.CharField(max_length=200)
location_point = LocationField(based_fields=['city'], zoom=7, default=Point(51.67, 32.65))
radius = models.IntegerField(default=1000) # radius in meters

class Shop(models.Model):
name = models.CharField(max_length=200)
location_point = LocationField(based_fields=['city'], zoom=7, default=Point(51.67, 32.65), null=True, blank=True)
zone = models.ForeignKey(Zone, on_delete=models.CASCADE, null=True)

LocationField是一个PointField,在django admin中具有更好的 map 。

我希望在每个商店上根据商店位置、区域位置和半径自动保存选择区域。如果没有具有半径的区域来支持商店,则将为“无”。我尝试了这个查询:

zone_list = Zone.objects.filter(
location_point__distance_lte=(
shop.location_point, D(m=models.F('radius'))
)
)

但我收到此错误:

TypeError: float() argument must be a string or a number, not 'F'

我该如何解决这个问题?

最佳答案

这似乎发生在 MeasureBase 内类django.contrib.gis.measure ( Distance / D 继承自),更具体地说 in the default_units method它试图在哪里转换 str或数字输入值 float但收到 F表达式代替。

我们可以采取的解决方法是 annotate Distance (小心使用此 Distance 方法,因为它来自 GeoDjango 地理数据库函数) shop.location_point 之间和当前的location_point然后我们可以通过距离 <= 进行过滤比实例 radius :

from django.contrib.gis.db.models.functions import Distance

zone_list = Zone.objects.annotate(
distance=Distance('location_point', shop.location_point)
).filter(distance__lte=F('radius'))

感谢 @e4c5 的出色回答:GeoDjango filter by distance from a model field

另一种方法是消除 annotation完全部分并直接通过 Distance 进行过滤:

from django.contrib.gis.db.models.functions import Distance

zone_list = Zone.objects.filter(
radius_gte=Distance('location_point', shop.location_point)
)

<小时/> 为了评论的连续性,我将其留在这里:

您可以尝试转换 F('radius')结果为 FloatField()使用 Cast() 将整数转换为 float 的方法。

zone_list = Zone.objects.filter(
location_point__distance_lte=(
shop.location_point,
D(m=Cast('radius', output_field=models.FloatField()))
)
)

关于python - Django用动态半径过滤位置距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58308732/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com