Python 如何使用Django将uuid过滤为文本?
如何使用Django将uuid过滤为文本?Python 如何使用Django将uuid过滤为文本?,python,django,Python,Django,如何使用Django将uuid过滤为文本? 例如,我想做下面的事情 class Group(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 在本例中,我收到了django.core.exceptions.FieldError:相关字段得到了无效的查找:startswith 我需要使用额外的吗?正如我在评论中所说,(至少不是以你想要的方式)。另一种选择(虽
例如,我想做下面的事情
class Group(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
在本例中,我收到了django.core.exceptions.FieldError:相关字段得到了无效的查找:startswith
我需要使用额外的吗?正如我在评论中所说,(至少不是以你想要的方式)。另一种选择(虽然可能不是最有效的)是在模型中包含UUID的字符串表示形式的属性或
class Cast(Func):
function = "CAST"
template = "%(function)s(%(expressions)s AS varchar)"
Group.objects.annotate(sid=Cast(id)).filter(sid__startswith='000')
可能是这样的?我假设
id
是一个UUIDField
,但是请在这里添加您的模型(以及任何其他相关代码),这样我们就可以确定并给出准确的答案:)@LucaBezerra谢谢,您是对的id
是一个UUIDField
。我添加了一些行。你能试试\uu icontains
而不是\uu startswith
,只是为了检查一下吗?我知道它没有你想要的那种行为,但我只是想看看它是否有效。有些地方说,UUID
不可搜索。其他地方说,Postgres处理uuid字段的方式与其他数据库不同——显然,它存储uuid时没有破折号。出于好奇,你为什么要这样做?以000
开头的UUID的意义是什么?@LucaBezerra-查询UUID的唯一方法是将其转换为字符串。请记住,强制转换将意味着列上的任何索引都将被忽略,并将被顺序扫描。事实是,任何建议都将是不正确的。如果OP需要通配符搜索这些值,它们应该将其转换为文本,然后插入uuid的字符串表示,而不是default=uuid.uuid4。然后索引将以零功能损失的方式工作。唯一的区别是大小-UUID是16字节的128位数据类型,而文本有开销,因此UUID的最小长度为33字节。@Trent我的知识不允许我说绝对没有“非黑客”的方法来做到这一点,但我同意你关于我能想到的唯一选项的看法。
class Cast(Func):
function = "CAST"
template = "%(function)s(%(expressions)s AS varchar)"
Group.objects.annotate(sid=Cast(id)).filter(sid__startswith='000')