Django model/form field that plays nicely with Arrow
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Django Arrow Field

Build Status Code Health

NOTE: This was an experiment in creating custom model fields, and we are not using this in production.

Django Arrow Field is a custom model field that represents dates stored in the database as Arrow instances instead of datetime's. Arrow is a wonderful datetime library with a much saner API than the standard library datetime. ArrowField is a drop-in replacement.


pip install django-arrow-field



To use it in your models it's a simply case of declaring the field on your model class.

from django.db import models
from arrow_field.model_fields import ArrowField

class Person(models.Model):
    first_name = models.CharField(max_length=100)
    birthday = ArrowField()

Then you just use it the same way you would any other model field.

import arrow

person = Person.objects.create(
    birthday=arrow.get(1994, 11, 7)

# <Arrow [1994-11-07T00:00:00+00:00]>

person = Person.objects.get(birthday=arrow.get(1994, 11, 7))
# Jacob


By default ModelForm's will use the ArrowField form field for arrow fields. ArrowField subclasses DateTimeField and is functionally equivalent. You can override it with any option that is valid for DateTimeField.

from django.forms import ModelForm

from .models import Person
from arrow_field.form_fields import ArrowField

class PersonForm(ModelForm):
    birthday = ArrowField(help_text='Enter your birthday')

    class Meta:
        model = Person

You can also use ISO8601ArrowField to accept ISO8601 timestamps, for example 1994-11-07T00:00:00+00:00. This is useful when receiving timestamps from javascript.

from django.forms import ModelForm

from .models import Person
from arrow_field.form_fields import ISO8601ArrowField

class PersonForm(ModelForm):
    birthday = ISO8601ArrowField()

    class Meta:
        model = Person


  • The queryset datetimes() method returns a datetime instance, not an Arrow