我使用datastax python驱动程序和django cassandra引擎的组合,通过django应用程序与cassandra通信。
下面是如何使用用户定义的类型列定义模型(仅示例):
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引擎包括 DjangoCassandraQuerySet
同学们,是不是玩得不好了 UserDefinedType
同学们,虽然我不知道为什么。
到目前为止,我还没有遇到任何关于这些库的问题,而且我发现像这样的操作不受支持是很奇怪的。我希望我错过了某个配置,或者至少这个问题是可以解决的。
谢谢你抽出时间。
1条答案
按热度按时间dgtucam11#
感谢django cassandra引擎问题页面上的此评论,以获得此问题的解决方案。
datastax python驱动程序似乎将未注册的类型解释为普通字典,从而导致它们被反序列化为一系列元组,而不是正确的字典,从而解释了错误消息。
解决方案是在连接启动时注册udt。每次都必须这样做,因为它似乎不会持续下去。
为此,请在udt类声明之后添加以下代码:
或者,您可以将此代码添加到
__init__.py
文件,如果您有一个udt类声明包。为什么django-cassandra引擎不自动注册这些类型,我不知道。