This is a fork of https://github.com/mvpdev/django-eav to adapt different things:
- Make it Python 3 compatible
- Make it Django 2.0 compatible
- Remove dependency on Django Site framework
- Allow a custom
Entity
class and customEntityManager
class (this is particular useful to override theget_all_attributes
method and change the logic to filter a given Entity attributes, like assigning attributes at model instance level). - Make
Attribute
slug unique forAttribute
- Make
name
andcontent_type
unique forAttribute
- Build
Attribute
slug usingname
andcontent_type
, thus using the name directly (ex: color) would not work. Use set_value() of Entity instead. - Add contraint at database level that a
Value
for anAttribute
can exist only once for an entity record. - Add
object_content_type
to define the (optional)ContentType
of an objectAttribute
- Add
TYPE_DECIMAL
attribute type (using djangoDecimalValidator
) - Add
TYPE_POINT
andTYPE_MULTIPOLYGON
Attribute types, relying on GeoDjango - Add
size
forAttribute
displaying configuration - Add a global EAV_REGISTRATION` setting to turn on/off registration
- Add a model_bypass_required() method to ``Entity` to allow overriding in a custom class and permit some models to have required attributes without value
The EavConfig
now includes two new attributes entity_class
and entity_manager
, that default to Entity
and EntityManager
respectively.
What is this useful for? Let's say you want to filter the attributes of a given instance based on values, tags or any relational information related to that specific instance. Then, you could specify your custom Entity
class and override the get_all_attributes()
method.
WARNING: If you have non unique slug values in your database you will need to update them before running the migrations.
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.
Note
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.
You can install django-eav directly from github:
pip install -e git+git://github.com/sromero84/django-eav.git#egg=django-eav
Run migrate
Add eav
to your INSTALLED_APPS
in your project's settings.py
file.
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 @register_eav() class MyModel(models.Model): ...
>>> from eav.models import Attribute >>> Attribute.objects.create(name='Weight', datatype=Attribute.TYPE_FLOAT) >>> Attribute.objects.create(name='Color', datatype=Attribute.TYPE_TEXT)
>>> m = MyModel() >>> m.eav.weight = 15.4 >>> m.eav.color = 'blue' >>> m.save() >>> m = MyModel.objects.get(pk=m.pk) >>> m.eav.weight 15.4 >>> m.eav.color blue >>> p = MyModel.objects.create(eav__weight = 12, eav__color='red')
>>> MyModel.objects.filter(eav__weight=15.4) >>> MyModel.objects.exclude(name='bob', eav__weight=15.4, eav__color='red')