将Python中的UUID对象转换为字符串表示形式列表

13

使用values_list检索包含UUIDField类型主键的查询集时,Django将返回一个UUIDField对象列表,而不是字符串UUID列表。

例如,以下代码将返回一个查询集:

items = Item.objects.values_list('id', flat=True).filter()

print(items) 的输出结果为:

[UUID('00c8aa9e-2f61-4bac-320c-ab26b8fb1de9')]

但是我希望列表是UUID的字符串形式,即:
 ['00c8aa9e-2f61-4bac-320c-ab26b8fb1de9']

我可以使用循环遍历每个对象,但我希望更改整个查询集。这可行吗?

我尝试过:

print(str(items))
2个回答

28

您可以使用Django特定的数据库方法来解决这个问题,而不是将解决方案加载到内存中。

Django现在有Cast函数,可以从django.db.model.functions导入。

然后可以在查询中使用它:

from django.db.models import TextField
from django.db.models.functions import Cast


items = Item.objects.annotate(str_id=Cast('id', output_field=TextField())).values_list('str_id', flat=True)

8
你有一个对象列表,想要将其转换为一个字符串列表:
items = [str(o) for o in items]

实现这种转换的唯一方法是处理每个项。
问题在于,print(str(items))不能达到你想要的效果,它会将列表对象转换为字符串(无论如何,print()都会这样做),而不是列表中每个对象。

好的,我已经得到了“items = [str(o) for o in items]”,但是真的没有其他方法吗? - Prometheus
你为什么想要别的东西? - Martin Thoma
好问题,我不确定它是否仅仅是效率低下,但我对这个陈述没有依据。 - Prometheus
1
这可能是一个 XY 问题。为什么要将您的 UUID 列表转换为字符串列表?此类转换将是 O(n) 的,因此对于大量数据而言会“很慢”。看起来您可能正在使用 django,因此如果您真的希望将数据作为字符串,则可以有一种不同的建模方式(在 django 和 / 或数据库中)作为字符串。 - dsh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接