django model字段允许存储距离(单位)。

django-distance-field的Python项目详细描述


Squarehost Logodjango距离字段

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 UnitAlias
british_chain_benoitBritish chain (Benoit 1895 B)
british_chain_sears_truncatedBritish chain (Sears 1922 truncated)
british_chain_searsBritish chain (Sears 1922)
british_ftBritish foot (Sears 1922)
british_ftBritish foot
british_ydBritish yard (Sears 1922)
british_ydBritish yard
chain_benoitChain (Benoit)
chain_searsChain (Sears)
clarke_ftClarke's Foot
clarke_linkClarke's link
cmcentimeter
ft'
ftFoot (International)
ftfoot
german_mGerman legal metre
gold_coast_ftGold Coast foot
inch"
inchinches
inchin
indian_ydIndian yard
indian_ydYard (Indian)
kmkilometer
kmkilometre
link_benoitLink (Benoit)
link_searsLink (Sears)
mimile
mmmillimeter
mmmillimetre
mmeter
mmetre
nm_ukNautical Mile (UK)
nmNautical Mile
sears_ydYard (Sears)
survey_ftU.S. Foot
survey_ftUS survey foot
ummicrometer
ummicrometre
uru
ydyard

由于我们不是太挑剔,别名不区分大小写

我的化名不在吗?

好吧,和单位一样,你可以自己添加关键字参数键应该是新的别名,值为现有单位:

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选项,例如blanknullmax_digitsdecimal_places。请记住,该字段实际上将存储在指定的unit中,因此您可能需要根据需要更改最大位数和精度。

另外,考虑到你的单位很可能被转换成所有其他奇怪和奇妙的单位,你可能需要几个额外的小数位来尝试减少任何奇怪的舍入错误的发生。

默认值unit为m(米),max_digits为14,decimal_places为6。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓中通过TCP发送时java文件损坏   Java测试预期=异常失败,断言错误   java ssh4 LazyInitializationException   java是否可以在集合中添加重复项?   java是一个免费的开源数据库管理工具   java是否可以在导出的html中嵌入图像   编译器构造解释一些东西,并用Java运行生成的字节码?   java KeyPairGenerator未生成随机密钥   java使用正则表达式生成字符串而不是匹配字符串   java中的多线程线程间通信   具有复合密钥的java Hibernate合并问题   java不能在MainActivity类之外使用SharedReferences变量   正在获取切割/零件异常消息。使用java Spring ControllerAdvice   java tomcat漏洞讨论   javascript在Java中实现“system”命令   java如何在JUnit5*中加载*Spring测试上下文之前获取回调?   java bluej关于缺少返回语句   JavaSpringBoot@ModelAttribute包含使用字符串键的其他模型   从可选中抛出异常。ifPresent()Java 8