我对 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
无效。”
因此我放弃了序列化方法。如果这是唯一/最好的方式,我很乐意重新审视它。
非常感谢您的建议!