Python Cassandra用户定义类型上的Django Queryset抛出类型错误
我使用和的组合通过Django应用程序与Cassandra通信 以下是我如何使用用户定义的类型列定义模型(仅示例): 我试图通过以下调用查询此模型:Python Cassandra用户定义类型上的Django Queryset抛出类型错误,python,django,cassandra,django-queryset,datastax,Python,Django,Cassandra,Django Queryset,Datastax,我使用和的组合通过Django应用程序与Cassandra通信 以下是我如何使用用户定义的类型列定义模型(仅示例): 我试图通过以下调用查询此模型: 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
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引擎(包括Django CassandraQuerySet
类)与UserDefinedType
类的配合不太好,尽管我不确定原因
到目前为止,我还没有遇到任何关于这些库的问题,我觉得奇怪的是,这样的操作不受支持。我希望我错过了某个配置,或者至少这个问题是可以解决的
感谢您抽出时间。感谢Django Cassandra引擎问题页面上的,以获得此问题的解决方案
DataStax Python驱动程序似乎将未注册的类型解释为普通字典,导致它们被反序列化为一系列元组,而不是正确的字典,从而解释错误消息
解决方案是在连接启动时注册UDT。每次都必须这样做,因为它似乎不会持续下去
为此,请在UDT类声明之后添加以下代码:
from cassandra.cqlengine import columns
from cassandra.cqlengine.usertype import UserType
from django.db import connections
from cassandra.cluster import UserTypeDoesNotExist
class UserAddress(UserType)
street = columns.Text()
number = columns.Integer()
user_types = [ UserAddress ]
database_name = 'DjangoDBName'
keyspace = 'CassandraKeyspace'
connection = connections[database_name]
for udt in user_types:
try:
connection.connection.cluster.register_user_type(keyspace, udt.type_name(), udt)
except UserTypeDoesNotExist:
pass
或者,如果您有一个UDT类声明包,则可以将此代码添加到\uuuu init\uu uu.py
文件中
为什么Django Cassandra引擎不自动注册这些类型,我不知道。多亏了Django Cassandra引擎问题页面上的解决方案
DataStax Python驱动程序似乎将未注册的类型解释为普通字典,导致它们被反序列化为一系列元组,而不是正确的字典,从而解释错误消息
解决方案是在连接启动时注册UDT。每次都必须这样做,因为它似乎不会持续下去
为此,请在UDT类声明之后添加以下代码:
from cassandra.cqlengine import columns
from cassandra.cqlengine.usertype import UserType
from django.db import connections
from cassandra.cluster import UserTypeDoesNotExist
class UserAddress(UserType)
street = columns.Text()
number = columns.Integer()
user_types = [ UserAddress ]
database_name = 'DjangoDBName'
keyspace = 'CassandraKeyspace'
connection = connections[database_name]
for udt in user_types:
try:
connection.connection.cluster.register_user_type(keyspace, udt.type_name(), udt)
except UserTypeDoesNotExist:
pass
或者,如果您有一个UDT类声明包,则可以将此代码添加到\uuuu init\uu uu.py
文件中
为什么Django Cassandra引擎不自动注册这些类型,我不知道