Entity Attribute Value
Clone or download
Hamdi Sahloul
Hamdi Sahloul Merge pull request #52 from jiargei/patch-1
Update models.py for python3
Latest commit 41e99fa Apr 3, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs More spelling corrections Sep 29, 2010
eav Update models.py for python3 Apr 3, 2018
.gitignore Include migrations Oct 13, 2016
README.rst Adding registration decorator and updating README with Prereqs for Si… Aug 16, 2015
setup.py Improve Py3 support (#48) Mar 30, 2018




django-eav provides an Entity-Attribute-Value storage model for django apps.

For a decent explanation of what an Entity-Attribute-Value storage model is, check Wikipedia.


This software was inspired / derived from the excellent eav-django written by Andrey Mikhaylenko.

There are a few notable differences between this implementation and the eav-django implementation.

  • This one is called django-eav, whereas the other is called eav-django.
  • This app allows you to to 'attach' EAV attributes to any existing django model (even from third-party apps) without making any changes to the those models' code.
  • This app has slightly more robust (but still not perfect) filtering.


From Github

You can install django-eav directly from guthub:

pip install -e git+git://github.com/mvpdev/django-eav.git#egg=django-eav


Django Sites Framework

As of Django 1.7, the Sites framework is not enabled by default; Django-EAV requires this framework. To enable the sites framework, follow these steps:

Add django.contrib.sites to your INSTALLED_APPS setting. Be sure to add sites to the installed apps list BEFORE eav!

Define a SITE_ID setting:


Run migrate


Edit settings.py

Add eav to your INSTALLED_APPS in your project's settings.py file. Be sure to add eav to the installed apps list AFTER the sites framework!

Register your model(s)

Before you can attach eav attributes to your model, you must register your model with eav:

>>> import eav
>>> eav.register(MyModel)

Generally you would do this in your models.py immediate after your model declarations. Alternatively, you can use the registration decorator provided:

from eav.decorators import register_eav
class MyModel(models.Model):

Create some attributes

>>> from eav.models import Attribute
>>> Attribute.objects.create(name='Weight', datatype=Attribute.TYPE_FLOAT)
>>> Attribute.objects.create(name='Color', datatype=Attribute.TYPE_TEXT)

Assign eav values

>>> m = MyModel()
>>> m.eav.weight = 15.4
>>> m.eav.color = 'blue'
>>> m.save()
>>> m = MyModel.objects.get(pk=m.pk)
>>> m.eav.weight
>>> m.eav.color

>>> p = MyModel.objects.create(eav__weight = 12, eav__color='red')

Filter on eav values

>>> MyModel.objects.filter(eav__weight=15.4)

>>> MyModel.objects.exclude(name='bob', eav__weight=15.4, eav__color='red')

Documentation and Examples