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

2023-12-13

我在 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)

位置字段是一个PointField,在django admin中具有更好的地图。

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

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

但我收到这个错误:

类型错误:float() 参数必须是字符串或数字,而不是“F”

我怎样才能解决这个问题?


这似乎发生在MeasureBase类的django.contrib.gis.measure (which Distance/D继承自),更具体地说in the default_units method它尝试投射的地方str或数字输入值float但收到一个F表达代替。

作为解决方法,我们可以做的是annotate the 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 按距模型字段的距离进行过滤

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

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

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

I leave this here for comment continuity:

You can try to cast the F('radius') result as a FloatField() using the Cast() method to turn the Integer to a Float.

zone_list = Zone.objects.filter(
    location_point__distance_lte=(
        shop.location_point, 
        D(m=Cast('radius', output_field=models.FloatField()))
    )
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django用动态半径过滤位置距离 的相关文章

随机推荐

  • 即时生成自签名证书

    我四处搜寻 但没有找到明确的例子 我想以编程方式创建一个自签名 自 信任的证书 C 按照以下步骤操作 STEP 1 即时创建根 CA 证书并将其添加到 受信任的根证书颁发机构 文件夹中的证书存储中 我想做的正是这个命令行工具所做的事情 ma
  • 无法从shinyapps.io连接到Microsoft Azure

    我构建了一个从 Microsoft Azure 提取数据的 Rshiny 应用程序 当我在连接字符串中使用 SQL Server 驱动程序时 我的应用程序可以在本地运行 但当我在shinyapps io 上发布应用程序时 我的应用程序无法运
  • Angular 2 中的兄弟事件通信

    我当时的项目中有五个组件 它们是 1 AppComponent Main component 2 AuthComponent 3 HomeComponent 4 HeaderComponent 5 FooterComponent AppCo
  • 当内容高度 > 2000px 时,WP7 ScrollViewer 错误

    在我的项目中 我使用ScrollViewer显示一些长的高度信息 我这样使用
  • 以编程方式将内容添加到 TreeViewItem

    我正在尝试创建一个新的 TreeViewItem 其中包含一个控件 如下所示
  • 倒计时器?

    如何制作倒计时器 当用户加载页面时 时钟开始倒计时 到达时间后 它将浏览器重定向到新页面 找到这个了 不太好用 http encosia com 2007 07 25 display data updates in real time wi
  • FFMPEG iOS 7 库

    我尝试阅读很多教程 我花了几个小时在谷歌和 stackoverflow 上尝试回答 到目前为止我读过 尝试使用armv6和arv7架构为iPhoneOS平台编译FFMPEG库 FFMPEG 在 iphone ipad 项目上的集成 and
  • 使用 LESS 递归函数和媒体查询生成样式

    我正在尝试生成一些相对于屏幕高度的内容 并决定尝试使用 LESS 来生成类似的内容 即使作为测试有点重 baseHeight 1px setRelativeHeight screenHeight minHeightDiff maxHeigh
  • 重绘未按要求正常运行

    我制作了一个俄罗斯方块游戏 现在我已经使用 JPanel 来显示内容和块 使用 PaintComponents 方法 问题是每当我尝试从另一个 JFrame 调用俄罗斯方块程序时 它根本不绘制 我的俄罗斯方块主菜单的代码是 import j
  • 源更改时 VBA 刷新用户窗体列表框数据

    您好 我的用户表单中的列表框数据遇到问题 当我尝试更改列表框连接的源文件时 它似乎没有改变 一开始它显示了良好的数据 但是当我尝试单击 运行日期 按钮时 它与我的范围内的值不匹配 该值被设置为我的排序键 这是我用于按升序和降序排序的运行日期
  • 有没有办法在 Program.exe.manifest 的 UMMM(无人值守制作我的清单)创建中指定 File Name= ?

    有没有办法调整 UMMM ini 文件和 或 UMMM bat 文件以在
  • 为什么显示内联块与文本高度匹配?

    我有一个锚标记 并且我正在使用 before 选择器添加一些文本 我在锚标记周围添加了悬停状态 这 before文本比锚标记中的其余文本稍大 我添加了一个display inline block属性为之前的文本 当我将鼠标悬停在锚标记上时
  • 根据词典数据框替换语料库中的单词

    我有兴趣替换 a 中的所有单词tm根据由两列数据框组成的字典的语料库对象 其中第一列是要匹配的单词 第二列是替换单词 我被困住了translate功能 我看见这个答案但我无法将其转换为要传递给的函数tm map 请考虑以下 MWE libr
  • 为什么MQTT被称为“轻量级”消息传递协议?

    As per 维基百科 and Mqtt org MQTT 是一种机器对机器 M2M 物联网 连接协议 它被设计为极轻发布 订阅消息传输 与其他 TCP IP 或基于套接字的协议相比 是什么让 MQTT 极其轻量级 MQTT的协议开销极小
  • 有人可以向我解释一下 JavaScript getCookie() 中 while 循环的功能吗?

    抱歉有个问题要问 下面是W3C学院的getCookie代码教程 有人能教我一下有什么作用吗while c charAt 0 c c substring 1 既然是 while 循环 为什么它不会继续重复并卡在那里 谢谢 function g
  • Firebase规则:允许推送但不允许更新

    我正在努力理解如何允许用户在列表中创建新记录 但只允许创建者更新自己的帖子 例如 以下结构 post post1 author user1 text Some text post2 author user2 text Some text 2
  • 增强几何和精确点类型

    我目前正在研究一个处理几何问题的项目 由于这个项目将用于商业用途 我不能使用像 CGAL 这样的库 我目前正在使用 boost geometry 和不精确的类型 但遇到了数字问题 我尝试简单地使用 boost multi precision
  • jQuery 不适用于括号编辑器

    那么 嗨 我已经尝试了所有我知道和不知道的事情 但我就是无法让它发挥作用 是的 我的 html 骨架中有一个 script 标签 我还尝试下载它 然后将其作为脚本标记添加到我的 html 框架中 什么都不起作用 我正在另一个 file js
  • 无法获取最新的 Conda 版本(具有升级的 PowerShell 初始化支持的 V 4.6.1)来使用 PowerShell(理想情况下与 VSCode 集成)

    Conda 的最新版本 4 6 1 声称增加了初始化支持 特别是引用了 PowerShell 从这个官方更新发布文档中可以看出 但是 在升级和初始化设置时 conda update conda conda init 产生这个输出 C Use
  • Django用动态半径过滤位置距离

    我在 django 一个区域和一个商店中有 2 个模型 模型如下 from django contrib gis db import models from django contrib gis geos import Point from