在django中使用uuid查询对象

时间:2017-05-22 09:14:42

标签: python django django-queryset uuid

我正在使用uuid来创建一个id字段,它是主键,如下所示

import uuid

class User_Profile(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

因此,每当我们将对象保存到数据库中时,它都将保存为UUID实例而不是字符串,如下所示

user_profiles = User_Profile.objects.values_list('id', flat=True)
print user_profiles
[UUID('193b6acc-2b78-4ddc-9ef8-632cde33ef74')]

现在如何使用django ORM查询它?因为它没有保存为字符串,所以我无法像下面那样获取它并收到错误

user_profile = User_Profile.objects.get(id='193b6acc-2b78-4ddc-9ef8-632cde33ef74')

错误:

ValueError: invalid literal for int() with base 10: '193b6acc-2b78-4ddc-9ef8-632cde33ef74'

当我从Django的查询参数中收到这个uuid作为字符串时,我也尝试将它从字符串转换为uuid,如下所示,我收到了错误

import uuid
id = uuid.UUID('193b6acc-2b78-4ddc-9ef8-632cde33ef74')
user_profile = User_Profile.objects.get(id=id)

错误:

ProgrammingError: operator does not exist: uuid = numeric
LINE 1: ...ifications" FROM "tc_user_profile" WHERE "tc_user_profile"."id" = 33539211...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

那么最后如何从django数据库查询uuid id字段?

3 个答案:

答案 0 :(得分:1)

我假设你使用postgreSQL:

Django文档说:在PostgreSQL上使用时,它以uuid数据类型存储,否则存储在char(32)中。

https://docs.djangoproject.com/fr/1.11/ref/models/fields/

答案 1 :(得分:1)

实际上,我已经在我的机器上用数据库PostGres尝试了这个,它可以工作,

>>> user = User_Profile.objects.create()
>>> user
<User_Profile: User_Profile object>
>>> user.id
UUID('d92c2280-4682-42ea-86c3-a1ed993c0638')
#copied the string of uuid only.
>>> id = 'd92c2280-4682-42ea-86c3-a1ed993c0638'
>>> User_Profile.objects.get(id=id)
<User_Profile: User_Profile object>

>>> import uuid
#converted the string into UUID format
>>> id = uuid.UUID(id)
>>> id
UUID('d92c2280-4682-42ea-86c3-a1ed993c0638')
>>> User_Profile.objects.get(id=id)
<User_Profile: User_Profile object>

如果问题仍然存在,请尝试删除数据库和迁移并重新创建。您遇到的问题与数据库无关,可能是您配置中的问题。

答案 2 :(得分:0)

该字段是一个UUID,因此您应该传递一个UUID来查询它。如果你看到它,这是非常直截了当的:

import uuid
id = uuid.UUID('193b6acc-2b78-4ddc-9ef8-632cde33ef74')
user_profile = User_Profile.objects.get(id=id)