我在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中具有更好的地图。
我希望在每个商店中根据商店位置,区域位置和半径自动选择区域。如果没有半径可支持车间的区域,则将为“无”。我试过这个查询:
zone_list = Zone.objects.filter(
location_point__distance_lte=(
shop.location_point, D(m=models.F('radius'))
)
)
但是我得到这个错误:
TypeError:float()参数必须是字符串或数字,而不是’F’
我怎样才能解决这个问题?
这似乎内部发生MeasureBase
类django.contrib.gis.measure
(其Distance
/D
从继承),更具体的default_units
方法,其中它试图铸造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根据与模型字段的距离进行过滤
另一种方法是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()))
)
)
你怎么能通过数据库,根据你的位置,在一个半径的距离内找到公司?
问题内容: 假设我们在ElasticSearch索引中有一堆文档。每个文档 在一个数组中 都有多个位置,如下所示: 根据ElasticSearch参考指南 该过滤器可以针对每个文档使用多个位置/点。一旦单个位置/点与过滤器匹配,则文档将包含在过滤器中。 因此,是否可以创建检查数组中所有位置的地理距离过滤器? 不幸的是,这似乎不起作用: 抛出“ ”,因为它不是单个值,而是s 的数组。 问题答案: 您
问题内容: 在一个数据库中,我存储了大约500条记录,每条记录都有一个经度和纬度。 在一个Activity中,我实现了- ,在-method中,我需要显示距离从该侦听器接收到的位置XX米以内的记录。 在SQL或Java中是否有(简便)方法来做到这一点? 问题答案: 试试这个示例代码,
问题内容: 我刚刚开始使用SQLAlchemy。我决定使用它,因为我在sqlite查询中间使用了很多字符串表达式。 所以,这就是我的问题。我的桌子上有很多设备,每个设备都有维护级别的日期。关键是用户可以选择他想在屏幕上看到的维护级别。因此,我应该为他选择的每种维护级别组合“调整”我的SQLAlchemmy。 例如,在原始SQLite中。 SELECT * WHERE(设备IN [])和m_leve
问题内容: Django中具有多个参数的过滤器和链式过滤器之间的区别 问题答案: 正如你在生成的SQL语句中看到的那样,差异不是某些人可能怀疑的“或”。这是WHERE和JOIN放置的方式。 Example1(相同的联接表):来自https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relatio
问题: 给定n个半径为r1的圆...rn和位置p1...pn。该算法必须找到包含所有n个圆的最小半径的圆的半径和圆心。圆的位置和半径是固定的,所以不能移动。 圆圈的结构可以看起来像这样: 输入值:[c1...cn] (c圈) 输出值:c 图像示例: 我的想法: 如果我找到最远的两点之间的距离并将圆心放在这条直线的一半上,我就可以画出包含n个圆的最小圆,但是有可能其他圆与主圆的圆心之间的距离比最远的