django-eav2/eav/managers.py

56 lines
1.5 KiB
Python
Raw Normal View History

"""
This module contains the custom manager used by entities registered with eav.
"""
2010-09-27 13:28:52 +00:00
from django.db import models
2021-10-16 17:45:01 +00:00
from eav.queryset import EavQuerySet
2010-09-27 13:28:52 +00:00
class EntityManager(models.Manager):
"""
Our custom manager, overrides ``models.Manager``.
"""
2021-10-16 17:43:02 +00:00
_queryset_class = EavQuerySet
2010-09-27 13:28:52 +00:00
def create(self, **kwargs):
"""
2010-09-27 13:28:52 +00:00
Parse eav attributes out of *kwargs*, then try to create and save
the object, then assign and save it's eav attributes.
"""
2010-09-27 13:28:52 +00:00
config_cls = getattr(self.model, '_eav_config_cls', None)
if not config_cls or config_cls.manager_only:
return super(EntityManager, self).create(**kwargs)
prefix = '%s__' % config_cls.eav_attr
new_kwargs = {}
eav_kwargs = {}
2018-04-06 11:59:51 +00:00
for key, value in kwargs.items():
2010-09-27 13:28:52 +00:00
if key.startswith(prefix):
2021-10-16 17:43:02 +00:00
eav_kwargs.update({key[len(prefix) :]: value})
2010-09-27 13:28:52 +00:00
else:
new_kwargs.update({key: value})
obj = self.model(**new_kwargs)
obj_eav = getattr(obj, config_cls.eav_attr)
2018-04-06 11:59:51 +00:00
for key, value in eav_kwargs.items():
2010-09-27 13:28:52 +00:00
setattr(obj_eav, key, value)
2010-09-27 13:28:52 +00:00
obj.save()
return obj
def get_or_create(self, defaults=None, **kwargs):
"""
2010-09-27 13:28:52 +00:00
Reproduces the behavior of get_or_create, eav friendly.
"""
2010-09-27 13:28:52 +00:00
try:
return self.get(**kwargs), False
2010-09-27 13:28:52 +00:00
except self.model.DoesNotExist:
if defaults:
kwargs = {**kwargs, **defaults}
return self.create(**kwargs), True