Я использую комбинацию DataStax Python Driver и Django Cassandra Engine для связи с Cassandra через приложение Django.
Вот как я определяю модель со столбцами определяемого пользователем типа (только для примера):
from cassandra.cqlengine import columns
from cassandra.cqlengine.usertype import UserType
from django_cassandra_engine.models import DjangoCassandraModel
class UserAddress(UserType)
street = columns.Text()
number = columns.Integer()
class User(DjangoCassandraModel):
__table_name__ = 'users'
user_id = columns.UUID(primary_key=True)
name = columns.Text()
address = columns.UserDefinedType(UserAddress)
class Meta:
managed = False
get_pk_field = 'user_id'
Я пытаюсь запросить эту модель с помощью следующего вызова:
User.objects.filter(user_id=user_id)
который вызывает эту ошибку:
File "/usr/local/lib/python3.8/site-packages/cassandra/cqlengine/columns.py", line 1043, in to_python
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
TypeError: tuple indices must be integers or slices, not str
Эта ошибка возникает из объявления класса UserDefinedType
, в частности этой функции:
def to_python(self, value):
if value is None:
return
copied_value = deepcopy(value)
for name, field in self.user_type._fields.items():
if copied_value[name] is not None or isinstance(field, BaseContainerColumn):
copied_value[name] = field.to_python(copied_value[name])
return copied_value
Мне кажется, что Django Cassandra Engine, который включает в себя класс DjangoCassandraQuerySet
, плохо сочетается с классом UserDefinedType
, хотя я не уверен, почему.
До сих пор у меня не было проблем с этими библиотеками, и я нахожу это странно, что подобная операция не поддерживается. Надеюсь, я где-то пропустил конфигурацию или, по крайней мере, проблема решаема.
Спасибо за ваше время.