adding support for using different queryset and dmlquery classes on a model
This commit is contained in:
@@ -7,10 +7,12 @@ from cqlengine.query import ModelQuerySet, DMLQuery, AbstractQueryableColumn
|
|||||||
from cqlengine.query import DoesNotExist as _DoesNotExist
|
from cqlengine.query import DoesNotExist as _DoesNotExist
|
||||||
from cqlengine.query import MultipleObjectsReturned as _MultipleObjectsReturned
|
from cqlengine.query import MultipleObjectsReturned as _MultipleObjectsReturned
|
||||||
|
|
||||||
|
|
||||||
class ModelDefinitionException(ModelException): pass
|
class ModelDefinitionException(ModelException): pass
|
||||||
|
|
||||||
DEFAULT_KEYSPACE = 'cqlengine'
|
DEFAULT_KEYSPACE = 'cqlengine'
|
||||||
|
|
||||||
|
|
||||||
class hybrid_classmethod(object):
|
class hybrid_classmethod(object):
|
||||||
"""
|
"""
|
||||||
Allows a method to behave as both a class method and
|
Allows a method to behave as both a class method and
|
||||||
@@ -44,7 +46,7 @@ class QuerySetDescriptor(object):
|
|||||||
""" :rtype: ModelQuerySet """
|
""" :rtype: ModelQuerySet """
|
||||||
if model.__abstract__:
|
if model.__abstract__:
|
||||||
raise CQLEngineException('cannot execute queries against abstract models')
|
raise CQLEngineException('cannot execute queries against abstract models')
|
||||||
return ModelQuerySet(model)
|
return model.__queryset__(model)
|
||||||
|
|
||||||
def __call__(self, *args, **kwargs):
|
def __call__(self, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
@@ -140,6 +142,10 @@ class BaseModel(object):
|
|||||||
#the keyspace for this model
|
#the keyspace for this model
|
||||||
__keyspace__ = None
|
__keyspace__ = None
|
||||||
|
|
||||||
|
# the queryset class used for this class
|
||||||
|
__queryset__ = ModelQuerySet
|
||||||
|
__dmlquery__ = DMLQuery
|
||||||
|
|
||||||
__read_repair_chance__ = 0.1
|
__read_repair_chance__ = 0.1
|
||||||
|
|
||||||
def __init__(self, **values):
|
def __init__(self, **values):
|
||||||
@@ -261,7 +267,7 @@ class BaseModel(object):
|
|||||||
def save(self):
|
def save(self):
|
||||||
is_new = self.pk is None
|
is_new = self.pk is None
|
||||||
self.validate()
|
self.validate()
|
||||||
DMLQuery(self.__class__, self, batch=self._batch).save()
|
self.__dmlquery__(self.__class__, self, batch=self._batch).save()
|
||||||
|
|
||||||
#reset the value managers
|
#reset the value managers
|
||||||
for v in self._values.values():
|
for v in self._values.values():
|
||||||
@@ -272,7 +278,7 @@ class BaseModel(object):
|
|||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
""" Deletes this instance """
|
""" Deletes this instance """
|
||||||
DMLQuery(self.__class__, self, batch=self._batch).delete()
|
self.__dmlquery__(self.__class__, self, batch=self._batch).delete()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _class_batch(cls, batch):
|
def _class_batch(cls, batch):
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from cqlengine.query import QueryException
|
from cqlengine.query import QueryException, ModelQuerySet, DMLQuery
|
||||||
from cqlengine.tests.base import BaseCassEngTestCase
|
from cqlengine.tests.base import BaseCassEngTestCase
|
||||||
|
|
||||||
from cqlengine.exceptions import ModelException, CQLEngineException
|
from cqlengine.exceptions import ModelException, CQLEngineException
|
||||||
@@ -300,6 +300,42 @@ class TestAbstractModelClasses(BaseCassEngTestCase):
|
|||||||
delete_table(ConcreteModelWithCol)
|
delete_table(ConcreteModelWithCol)
|
||||||
|
|
||||||
|
|
||||||
|
class TestCustomQuerySet(BaseCassEngTestCase):
|
||||||
|
""" Tests overriding the default queryset class """
|
||||||
|
|
||||||
|
class TestException(Exception): pass
|
||||||
|
|
||||||
|
def test_overriding_queryset(self):
|
||||||
|
|
||||||
|
class QSet(ModelQuerySet):
|
||||||
|
def create(iself, **kwargs):
|
||||||
|
raise self.TestException
|
||||||
|
|
||||||
|
class CQModel(Model):
|
||||||
|
__queryset__ = QSet
|
||||||
|
part = columns.UUID(primary_key=True)
|
||||||
|
data = columns.Text()
|
||||||
|
|
||||||
|
with self.assertRaises(self.TestException):
|
||||||
|
CQModel.create(part=uuid4(), data='s')
|
||||||
|
|
||||||
|
def test_overriding_dmlqueryset(self):
|
||||||
|
|
||||||
|
class DMLQ(DMLQuery):
|
||||||
|
def save(iself):
|
||||||
|
raise self.TestException
|
||||||
|
|
||||||
|
class CDQModel(Model):
|
||||||
|
__dmlquery__ = DMLQ
|
||||||
|
part = columns.UUID(primary_key=True)
|
||||||
|
data = columns.Text()
|
||||||
|
|
||||||
|
with self.assertRaises(self.TestException):
|
||||||
|
CDQModel().save()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user