如何为cassandra

时间:2016-07-12 19:43:20

标签: python model cassandra readonly

我有cassandra模型

from cassandra.cqlengine import columns
from cassandra.cqlengine.models import Model

class StudentModules(Model):
    """Model for Student get."""

    __table_name__ = 'students'
    student_id = columns.UUID(primary_key=True, default=uuid4)
    student_name = columns.Text(index=True)

就我而言,表students已经存在,我总是希望将此模块用于select查询。

我尝试了__abstract__属性,但在这种情况下,我无法调用filterget来调用模型。

1 个答案:

答案 0 :(得分:1)

没有内置的方法可以做到这一点。你可以通过定义一个中间类并覆盖变异方法来获得这样的行为*:

class ROModel(Model):
    __abstract__=True

    @classmethod
    def create(cls, **_):
        raise NotImplementedError()

    def save(self):
        raise NotImplementedError()

    def update(self, **_):
        raise NotImplementedError()

    def delete(self):
        raise NotImplementedError()

class Test(ROModel):
    __keyspace__='test'
    k = columns.Integer(primary_key=True)
    a = columns.Integer()
    b = columns.Integer()

print Test.objects.first()
Test(k=1, b=4).update()  # NotImplementedError
Test.create(k=1, a=2, b=3)  # NotImplementedError
Test(k=1).delete()  # NotImplementedError
Test(k=1, a=3).save()  # NotImplementedError

*请注意,这只是部分解决方案 - 您还需要使用类似的专业ROModel.__queryset__更新query.ModelQuerySet

然而,我无法理解这会给你带来什么。如果调用变异方法,任何使事物只读的解决方案都将导致运行时错误。

在任何情况下,您最好还使用auth和仅具有选择权限的用户/角色。 https://cassandra.apache.org/doc/latest/cql/security.html#data-control