我遇到了一个非常奇怪的问题,即使我输入了有效的UUID,但还是提示说不是有效的UUID。例如:
'fd31b6b5-325d-4b65-b496-d7e4d16c8a93' is not a valid UUID.
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in get_db_prep_value
2371. value = uuid.UUID(value)
File "/usr/lib64/python3.4/uuid.py" in __init__
134. hex = hex.replace('urn:', '').replace('uuid:', '')
During handling of the above exception ('UUID' object has no attribute 'replace'), another exception occurred:
我的模型有一个UUIDField作为主键,在某些情况下会出现错误,直到我重新启动服务器才会消失。当服务器重新启动时,它就能正常工作,所以我有点困惑。我使用的是django 1.10.7、postgresql 9.6.3和python 3.4.3在amazon aws上。 编辑: 导致问题的模型
class ReciboTransaccion(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
ingreso = models.ForeignKey('banco.BaseTransaccion', related_name='recibo_ingreso',
on_delete=models.PROTECT,
null=True, blank=True,
editable=False)
egreso = models.OneToOneField('banco.BaseTransaccion', related_name='recibo_egreso',
on_delete=models.PROTECT,
null=True, blank=True,
editable=False)
fecha = models.DateTimeField(auto_now_add=True)
模型'BaseTransaction'还具有
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
编辑2:
引发此错误的代码如下:
serial_movimientos = ReciboSerializer(recibos, many=True)
data = {
'movimientos': serial_movimientos.data, # Error happens here
}
这个序列化器比较标准(已删除序列化器方法)
class ReciboSerializer(serializers.ModelSerializer):
ingreso = serializers.SerializerMethodField()
egresos = serializers.SerializerMethodField()
descripcion = serializers.SerializerMethodField()
monedero_generado = serializers.SerializerMethodField()
reembolsada = serializers.SerializerMethodField()
class Meta:
model = ReciboTransaccion
fields = ('ingreso', 'egresos', 'descripcion', 'monedero_generado', 'reembolsada', 'fecha', )
其他的回溯信息如下:
File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/handlers/exception.py" in inner
42. response = get_response(request)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/opt/python/current/app/myproject/main/ws.py" in index
129. json_data = func(request)
File "/opt/python/current/app/myproject/main/ws.py" in get_datos_home
534. 'movimientos': serial_movimientos.data,
File "/opt/python/run/venv/lib/python3.4/site-packages/rest_framework/serializers.py" in data
739. ret = super(ListSerializer, self).data
File "/opt/python/run/venv/lib/python3.4/site-packages/rest_framework/serializers.py" in data
263. self._data = self.to_representation(self.instance)
File "/opt/python/run/venv/lib/python3.4/site-packages/rest_framework/serializers.py" in to_representation
657. self.child.to_representation(item) for item in iterable
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/query.py" in __iter__
256. self._fetch_all()
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/query.py" in _fetch_all
1087. self._result_cache = list(self.iterator())
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/query.py" in __iter__
54. results = compiler.execute_sql()
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in execute_sql
824. sql, params = self.as_sql()
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in as_sql
376. where, w_params = self.compile(self.where) if self.where is not None else ("", [])
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in compile
353. sql, params = node.as_sql(self, self.connection)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/sql/where.py" in as_sql
79. sql, params = compiler.compile(child)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/sql/compiler.py" in compile
353. sql, params = node.as_sql(self, self.connection)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in as_sql
297. return super(In, self).as_sql(compiler, connection)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in as_sql
156. rhs_sql, rhs_params = self.process_rhs(compiler, connection)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in process_rhs
284. sqls, sqls_params = self.batch_process_rhs(compiler, connection, rhs)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in batch_process_rhs
51. _, params = self.get_db_prep_lookup(rhs, connection)
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in get_db_prep_lookup
181. if self.get_db_prep_lookup_value_is_iterable else
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/lookups.py" in <listcomp>
180. [get_db_prep_value(v, connection, prepared=True) for v in value]
File "/opt/python/run/venv/lib/python3.4/site-packages/django/db/models/fields/__init__.py" in get_db_prep_value
2373. raise TypeError(self.error_messages['invalid'] % {'value': value})
UUIDField
是主键吗? - Zach Gatesuuid.UUID(uuid.UUID('fd31b6b5-325d-4b65-b496-d7e4d16c8a93'))
的操作时,就会发生这种情况。uuid.UUID()
不支持在调用已经是UUID的参数的情况。Django捕获了该情况,因此有些可疑。您能否添加一些代码,在字段转换之前记录value
的值? - dhke