"Quantity Field for Django using pint library for automated unit conversions"
Project description
Django Quantity Field
A Small django field extension allowing you to store quantities in certain units and perform conversions easily. Uses pint behind the scenes. Also contains a form field class and form widget that allows a user to choose alternative units to input data. The cleaned_data will output the value in the base_units defined for the field, eg: you specify you want to store a value in grams but will allow users to input either grams or ounces.
Compatibility
Requires django >= 2.2, and python 3.6/3.7/3.8/3.9
Installation
pip install django-pint
Simple Example
Best way to illustrate is with an example
# app/models.py
from django.db import models
from quantityfield.fields import QuantityField
class HayBale(models.Model):
weight = QuantityField('tonne')
Quantities are stored as float (Django FloatField) and retrieved like any other field
>> bale = HayBale.objects.create(weight=1.2)
>> bale = HayBale.objects.first()
>> bale.weight
<Quantity(1.2, 'tonne')>
>> bale.weight.magnitude
1.2
>> bale.weight.units
'tonne'
>> bale.weight.to('kilogram')
<Quantity(1200, 'kilogram')>
>> bale.weight.to('pound')
<Quantity(2645.55, 'pound')>
If your base unit is atomic (i.e. can be represented by an integer), you may also use IntegerQuantityField
and BigIntegerQuantityField
.
You can also pass Quantity objects to be stored in models. These are automatically converted to the units defined for the field ( but can be converted to something else when retrieved of course ).
>> from quantityfield.units import ureg
>> Quantity = ureg.Quantity
>> pounds = Quantity(500 * ureg.pound)
>> bale = HayBale.objects.create(weight=pounds)
>> bale.weight
<Quantity(0.226796, 'tonne')>
Use the inbuilt form field and widget to allow input of quantity values in different units
from quantityfield.fields import QuantityFormField
class HayBaleForm(forms.Form):
weight = QuantityFormField(base_units='gram', unit_choices=['gram', 'ounce', 'milligram'])
The form will render a float input and a select widget to choose the units.
Whenever cleaned_data is presented from the above form the weight field value will be a
Quantity with the units set to grams (values are converted from the units input by the user ).
You also can add the unit_choices
directly to the ModelField
. It will be propagated
correctly.
For comparative lookups, query values will be coerced into the correct units when comparing values, this means that comparing 1 ounce to 1 tonne should yield the correct results.
less_than_a_tonne = HayBale.objects.filter(weight__lt=Quantity(2000 * ureg.pound))
You can also use a custom Pint unit registry in your project settings.py
# project/settings.py
from pint import UnitRegistry
# django-pint will set the DJANGO_PINT_UNIT_REGISTER automatically
# as application_registry
DJANGO_PINT_UNIT_REGISTER = UnitRegistry('your_units.txt')
DJANGO_PINT_UNIT_REGISTER.define('beer_bootle_weight = 0.8 * kg = beer')
# app/models.py
class HayBale(models.Model):
# now you can use your custom units in your models
custom_unit = QuantityField('beer')
Note: As the documentation from pint states quite clearly: For each project there should be only one unit registry. Please note that if you change the unit registry for an already created project with data in a database, you could invalidate your data! So be sure you know what you are doing! Still only adding units should be okay.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file django-pint-0.5.tar.gz
.
File metadata
- Download URL: django-pint-0.5.tar.gz
- Upload date:
- Size: 25.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
7bcfa68ffd232613b066d18be74bd2aa8d76635993d559b7bc3d2287a52a5152
|
|
MD5 |
4fe1d48fe29f9da3ba7421e30884234b
|
|
BLAKE2b-256 |
3dcfaefda59b12075ce3c821142f555d5a890e29187cb362fff0dabae637a6c8
|
File details
Details for the file django_pint-0.5-py2.py3-none-any.whl
.
File metadata
- Download URL: django_pint-0.5-py2.py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/53.0.0 requests-toolbelt/0.9.1 tqdm/4.57.0 CPython/3.9.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
6a678d0509b04db6ac0bed49e013f9edac3e5836e1b9fc1a9a3b4bb48850eb3e
|
|
MD5 |
eb627120c5fc8ad061f1397341b9ef06
|
|
BLAKE2b-256 |
756d201bf20d8fede78dadbf92e58c5d94be91437ad927a1776927f09ae967de
|