django model字段允许存储距离(单位)。
django-distance-field的Python项目详细描述
django距离字段
92%的单元测试覆盖率 https://bitbucket.org/squarehost/django-distance-field.git
(c)2018 Squarehost有限公司http://www.squarehost.co.uk
伊恩舒默(ian@squarehost.co.uk)
这是什么?
django距离字段是django的gis字段的简单扩展,允许在模型中注册距离/测量字段。然后可以使用django的“d”对象转换此字段中的数据,并使用标准django queryset功能进行筛选。
它不需要安装支持gis的数据库或扩展。它应该适用于django 1.7及更高版本。
那是什么意思?
简单地说,您可以添加一个距离字段,允许用户使用多种单位输入测量值然后将此距离转换为标准单位格式(例如米),并存储在数据库中。用户指定的单位也会被存储,当检索到测量值时,会自动转换为这些单位以显示
嗯?
那么,一些psuedo代码怎么样?下面是如何使用api的:
In[1]:frommymodels.modelimportModelWithWidthHeightIn[2]:fromdistanceimportDIn[3]:inst=ModelWithWidthHeight()In[4]:inst.width="10m"In[5]:inst.widthOut[5]:D(m=10.0)In[6]:inst.height="10in"In[7]:inst.heightOut[7]:D(inch=10.0)In[8]:inst.width>inst.heightOut[8]:TrueIn[9]:inst.height.mOut[9]:0.254
是这样吗?打哈欠…
等等,还有呢您还可以使用D对象或字符串直接筛选queryset,使用所有常见的Django API细节:
In[1]:frommymodels.modelimportModelWithWidthHeightIn[2]:fromdistanceimportDIn[3]:ModelWithWidthHeight.objects.filter(width__lte="10m")Out[3]:<QuerySet[<ModelWithWidthHeight:ModelWithWidthHeightobject(1)>]>In[4]:ModelWithWidthHeight.objects.filter(width__lt="10m")Out[4]:<QuerySet[]>In[5]:ModelWithWidthHeight.objects.filter(width__lte="1000cm")Out[5]:<QuerySet[<ModelWithWidthHeight:ModelWithWidthHeightobject(1)>]>In[6]:ModelWithWidthHeight.objects.filter(width__lte="999cm")Out[6]:<QuerySet[]>In[7]:ModelWithWidthHeight.objects.filter(width__lte="1000cm",height__gt=D(inch=9))Out[7]:<QuerySet[<ModelWithWidthHeight:ModelWithWidthHeightobject(1)>]>
好吧,这看起来更有用。表单和小部件呢?
使用distancefield会自动导致表单中包含一个标准的charfield,,但是会应用相关的验证器以确保系统识别单元,如果不识别,则抛出一个validationerror。
然后将字段数据自动解析为d对象,并相应地存储在数据库中。
你认识什么单位?
除了Django的默认单元之外,我们还有一些其他单元被抛出(例如,Rack Units/U),这意味着当前的支持如下所示:
- 链,链贝诺特,链贝诺特,英式链贝诺特,英式链贝诺特,英式链贝诺特截断,厘米,英式英尺,英式码,克拉克英尺,克拉克链接,深渊,英尺,德国米,黄金海岸英尺,印度码,英寸,公里,链接,链接贝诺特,链接西尔斯,米,米,毫米,纳米,纳米英国,罗德,西尔斯码,测量英尺,姆,yd,u
如果您愿意,也可以添加单位-只需调用distance.register_units方法,将单位别名作为关键字参数,并将单位的数量(以米为单位)作为关键字值。例如:
In[1]:importdistanceIn[2]:distance.register_units(my_unit=0.5,my_other_unit=2)In[3]:distance.D(my_unit=10).mOut[3]:5.0In[4]:distance.D(my_unit=10).inchOut[4]:196.8503937007874In[5]:distance.D(my_other_unit=10).mOut[5]:20.0
你应该像你的应用程序准备方法那样做
别名呢?你说“英寸”,我说“英寸”
我们已经在d类中指定了各种别名:
Actual Unit | Alias |
---|---|
british_chain_benoit | British chain (Benoit 1895 B) |
british_chain_sears_truncated | British chain (Sears 1922 truncated) |
british_chain_sears | British chain (Sears 1922) |
british_ft | British foot (Sears 1922) |
british_ft | British foot |
british_yd | British yard (Sears 1922) |
british_yd | British yard |
chain_benoit | Chain (Benoit) |
chain_sears | Chain (Sears) |
clarke_ft | Clarke's Foot |
clarke_link | Clarke's link |
cm | centimeter |
ft | ' |
ft | Foot (International) |
ft | foot |
german_m | German legal metre |
gold_coast_ft | Gold Coast foot |
inch | " |
inch | inches |
inch | in |
indian_yd | Indian yard |
indian_yd | Yard (Indian) |
km | kilometer |
km | kilometre |
link_benoit | Link (Benoit) |
link_sears | Link (Sears) |
mi | mile |
mm | millimeter |
mm | millimetre |
m | meter |
m | metre |
nm_uk | Nautical Mile (UK) |
nm | Nautical Mile |
sears_yd | Yard (Sears) |
survey_ft | U.S. Foot |
survey_ft | US survey foot |
um | micrometer |
um | micrometre |
u | ru |
yd | yard |
由于我们不是太挑剔,别名不区分大小写
我的化名不在吗?
好吧,和单位一样,你可以自己添加关键字参数键应该是新的别名,值为现有单位:
In[1]:importdistanceIn[2]:distance.register_aliases(feet="ft")In[3]:distance.D(feet=10)Out[3]:D(ft=10.0)
那它是怎么工作的呢?
在模型中创建距离字段时,它也有默认单位(米,除非通过单位Kwarg进行更改)。传递给此单位字段的任何距离都将转换为此标准单位,然后以十进制形式保存到数据库中,其方式与十进制字段基本相同。
但你说它会记得我的部队吗?怎么用?
很高兴你这么问。或者,如果您不添加它,我们将记不起您的单位,但是对于您添加的每个DistanceField,您还应该添加一个DistanceUnitField,并告诉DistanceField有关它的信息distanceunitfield是一个简单的charfield,它根据distancefield中指定的单位自动填充。
您不需要担心这个字段,只需在模型中创建它并将distancefield指向它就可以了。它是不可编辑的,您不需要更改它
好吧,我被卖了。好吧,已经卖到可以下载和测试麻省理工学院许可的图书馆了。我怎么用?
你可以安装它r直接通过pypi(pip install django distance字段),或从git repo中签出:https://bitbucket.org/squarehost/django-distance-field.git
用法很简单。因为它只是一个字段,所以您不需要添加到已安装的_应用程序中,尽管如果您希望运行测试,也可以这样做。
在models.py文件中,根据需要创建DistanceField:
fromdistanceimportDistanceField,DistanceUnitFieldclassModelWithWidthHeight(models.Model):width=DistanceField(unit='m',unit_field='width_units')height=DistanceField(unit='in',unit_field='height_units')width_units=DistanceUnitField()height_units=DistanceUnitField()
distancefield还将尊重标准的django decimalfield选项,例如blank
、null
、max_digits
和decimal_places
。请记住,该字段实际上将存储在指定的unit中,因此您可能需要根据需要更改最大位数和精度。
另外,考虑到你的单位很可能被转换成所有其他奇怪和奇妙的单位,你可能需要几个额外的小数位来尝试减少任何奇怪的舍入错误的发生。
默认值unit
为m(米),max_digits
为14,decimal_places
为6。