我将纬度和经度存储为charfield(“纬度,经度”)。我更喜欢这样保留它。
我需要过滤结果以仅显示纬度> w,纬度< x,经度> y,经度< ž。
如何在不更改lat的存储方式的情况下执行此操作,长?
答案 0 :(得分:5)
Django ORM无法帮助您过滤该字段。您的架构设计不适合您正在尝试的查询类型。
我的建议:
修改架构以使用单独的数字列开头。 (我知道你是专门寻找避免这种情况的选项,但它仍然是正确的解决方案)。
添加两个新的数字列,并在对模型进行更改时更新/设置这些列。您还需要进行一次性批量更新,以便为所有现有行设置初始值。
您可以安装自定义SQL查询,该查询将遍历每一行并拆分列以检索纬度和经度的单独数值并对其进行过滤。在这种情况下,你几乎绕过ORM并直接转向SQL,并且需要使用数据库中可用的任何拆分方法(自定义拆分函数,正则表达式等)。查询会很慢。
向模型添加一个方法,该方法将在Python中拆分字符串并返回数字数据。要进行任何类型的过滤使用此数据,您需要从数据库中提取所有模型(昂贵)并在内存中进行过滤(快速但您将失去SQL和/或ORM的优势)。此选项可能无法很好地扩展。
答案 1 :(得分:1)
作为提及的评论者之一,您一定要看Geodjango,它提供本地地理信息支持。从他们的页面:GeoDjango是Django的附加组件,将其转变为世界级的地理Web框架。 GeoDjango致力于尽可能简单地创建地理Web应用程序,例如基于位置的服务。一些功能包括: