使用 Distance 注释 Django 查询集时定义测量单位

问题描述 投票:0回答:0

我对 django / python 很陌生。我目前正在尝试在 MySQL/Spatialite 上使用 GeoDjango 构建一个 Web 应用程序(稍后当我决定为专用环境付费时,我将转向 postgres/postGIS)。

我使用以下表达式来获取一个查询集,该查询集用每个 Splitter 公司的 service_area 的质心(点场)的距离进行注释。

sl = Splitter.objects.filter(company__in=companies, seats__gte=int(seatval), selfhire=selfval).annotate(distancefrom=Distance('company__service_areas__centroid', postcode_location)).order_by('distancefrom')

不确定这是否重要,但我正在从

django.contrib.gis.db.models.functions

导入距离

它工作正常,但是“距离”计算的默认值以米为单位。因此,我得到了如下所示的注释值:46035.39602585269 m

我更愿意以英里或公里为单位获取这些值。我如何更改表达式以强制注释改为使用这些单位?或者我可以使用什么方法来更新注释?我宁愿不迭代查询集。

通常 distance.mi 或 distance.km 会给我这些值,但我不确定如何将其作为注释的一部分?

我尝试了什么: 我尝试简单地将

.mi
添加到表达式中,但它似乎不起作用。

sl = Splitter.objects.filter(company__in=companies, seats__gte=int(seatval), selfhire=selfval).annotate(distancefrom=Distance('company__service_areas__centroid', postcode_location).mi).order_by('distancefrom')

我不愿意在查询集上使用 for 循环,因为有时 django 会出错并说 sl(查询集)不可迭代,尽管我不确定为什么。我还听说这不是理想的性能明智?

我尝试的其他方法是使用此处讨论的序列化程序: 如何在特定单元的queryset中标注postgis距离?

没有真正解释实现,所以我在 serializers.py 文件中对其进行了猜测:

from rest_framework import serializers
from splitter.models import Splitter

class SplitterSerializer(serializers.ModelSerializer):
    distancefrom = serializers.DecimalField(
        source='distancefrom.mi', max_digits=5, decimal_places=2, read_only=True)

    class Meta:
        model = Splitter
        fields = [
            'company',
            'vehicle_model',
            'seats',
            'fee',
            'comments',
            'trailer',
            'selfhire',
            'tourmanager',
            'sleeper',
            'foh',
            'lampy',
            'tech',
            'distancefrom'
        ]

基本上,我只是将模型中的所有字段放入序列化程序,添加注释(distancefrom)转换为选择的测量(mi)。我在 django shell 中玩过这个,例如:

sl = Splitter.objects.all()
serializer = SplitterSerializer(sl)
serializer.data

每当我尝试访问我无法解决的数据(最后一行)时,我都会遇到很多错误: “AttributeError:尝试在序列化程序

company
上获取字段
SplitterSerializer
的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与
QuerySet
实例上的任何属性或键都不匹配。 原始异常文本是:'QuerySet' 对象没有属性 'company'。”

为了解决这个问题,我在外键字段(公司、车辆模型)上附加了“_set”,但后来出现了这个错误: “django.core.exceptions.ImproperlyConfigured:字段名称

company_set
对模型
Splitter
无效。”

然后我尝试在模型本身中用 related_name='vehicle_model' 等标记外键并迁移,这又引发了这个错误: “django.core.exceptions.ImproperlyConfigured:字段名称

company_set
对模型
Splitter
无效。”

因此我放弃了序列化方法。如果这是唯一/最好的方式,我很乐意重新审视它。

非常感谢您的建议!

django django-queryset distance geodjango django-annotate
© www.soinside.com 2019 - 2024. All rights reserved.