Source code for alkali.relmanager

import inspect

from .query import Query

import logging
logger = logging.getLogger(__name__)


[docs]class RelManager: """ This is an internal class that a user of alkali unlikely to use directly. The ``RelManager`` class manages queries/connections between two models that have a :class:`alkali.fields.ForeignKey` (or equivalent) field. """ def __init__( self, foreign, child_class, child_field ): """ :param Model foreign: instance of the model that is pointed at :param Model child_class: the model class that contains the ForeignKey :param str child_field: the field name that points to ForeignKey """ assert not inspect.isclass(foreign) assert inspect.isclass(child_class) assert isinstance(child_field, str) self._foreign = foreign self._child_class = child_class self._child_field = child_field def __repr__(self): return "RelManager<{} <- {}.{}>".format( self._foreign.__class__.__name__, self._child_class.__name__, self._child_field ) @property def foreign(self): return self._foreign @property def child_class(self): return self._child_class @property def child_field(self): return self._child_field @property def count(self): return len(self.all())
[docs] def add(self, child): assert isinstance(child, self.child_class) setattr(child, self.child_field, self.foreign) return child
[docs] def create(self, **kw): assert self.child_field not in kw, "can't pass in foreign key value to create" child = self.child_class(**kw) child = self.add(child) return child
[docs] def all(self): """ get all objects that point to this instance see :func:`alkali.manager.Manager.all` for syntax :rtype: :class:`alkali.query.Query` """ return self.child_class.objects.filter(**{self.child_field: self.foreign})
[docs] def get(self, **kw): """ get a single object that refers to this instance see :func:`alkali.manager.Manager.get` for syntax :rtype: :class:`alkali.model.Model` """ if not kw: return self.child_class.objects.get( **{self.child_field: self.foreign} ) return self.child_class.objects.get(**kw)