当前位置: 首页 > 面试题库 >

具有动态半径的Django过滤器位置距离

柴茂材
2023-03-14
问题内容

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

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


问题答案:

这似乎内部发生MeasureBasedjango.contrib.gis.measure(其Distance/D从继承),更具体的default_units方法,其中它试图铸造str或数字输入值float而接收F表达式来代替。

我们可以做一个解决办法,就是annotateDistance

小心使用这个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个圆的最小圆,但是有可能其他圆与主圆的圆心之间的距离比最远的