Source code for horizon.query
from django.db.models import Model
from django.db.models.query import QuerySet as DjangoQuerySet
from django.db.utils import ProgrammingError
from .utils import get_key_field_name_from_model
[docs]class HorizontalQuerySetMixin(object):
def __init__(self, model=None, **kwargs):
super(HorizontalQuerySetMixin, self).__init__(model=model, **kwargs)
self._horizontal_key = None
@classmethod
def _get_horizontal_key_from_lookup_value(cls, lookup_value):
if not lookup_value:
return
if isinstance(lookup_value, Model):
return lookup_value.pk
return lookup_value
def _set_horizontal_key_from_params(self, kwargs):
if self._horizontal_key is not None:
return
key_field = self.model._meta.get_field(get_key_field_name_from_model(self.model))
lookup_value = kwargs.get(key_field.attname, None) or kwargs.get(key_field.name, None)
self._horizontal_key = self._get_horizontal_key_from_lookup_value(lookup_value)
def _create_object_from_params(self, lookup, *args, **kwargs):
self._set_horizontal_key_from_params(lookup)
return super(HorizontalQuerySetMixin, self)._create_object_from_params(
lookup, *args, **kwargs)
def _extract_model_params(self, defaults, **kwargs):
self._set_horizontal_key_from_params(kwargs)
return super(HorizontalQuerySetMixin, self)._extract_model_params(defaults, **kwargs)
def _filter_or_exclude(self, negate, *args, **kwargs):
self._set_horizontal_key_from_params(kwargs)
return super(HorizontalQuerySetMixin, self)._filter_or_exclude(negate, *args, **kwargs)
[docs] def create(self, **kwargs):
self._set_horizontal_key_from_params(kwargs)
return super(HorizontalQuerySetMixin, self).create(**kwargs)
def _clone(self, **kwargs):
clone = super(HorizontalQuerySetMixin, self)._clone(**kwargs)
clone._horizontal_key = self._horizontal_key
return clone
@property
def db(self):
if self._db:
return self._db
if self._horizontal_key is None:
raise ProgrammingError("Missing horizontal key field's filter")
self._add_hints(horizontal_key=self._horizontal_key)
return super(HorizontalQuerySetMixin, self).db
[docs]class QuerySet(HorizontalQuerySetMixin, DjangoQuerySet):
pass