1

我想为单个实例(例如,id=1)查询模型,但我只想返回单个字段('title')的值。我可以通过以下查询来实现这一点:

SomeModel.objects.filter(pk=1).values_list('title', flat=True)

但是 aget比 a 更有效filter。但是,values_list不要values使用get查询。理想情况下,我更愿意这样做:

SomeModel.objects.get(pk=1).values_list('title', flat=True)

但我收到以下错误:AttributeError: SomeModel has no attribute 'title'

编写此查询的最佳方法是什么?

4

1 回答 1

3

但是 aget比 a 更有效filter

这是不正确的。A.get(…)将生成与 a完全相同的 SQL .filter(…)

使用:

SomeModel.objects.filter(pk=1)[0:1].values_list('title', flat=True)

会做你想做的事,并且将具有完全相同的性能特征.get(…)(实际上,它会快一点,因为.get(…)检查是否会返回多行......):

在 [4] 中:导入日志记录

在 [5] 中: l = logging.getLogger("django.db")

在 [6] 中:l.setLevel(logging.DEBUG)

在 [7] 中:User.objects.filter(id=1)[0:1].values_list()
DEBUG:django.db.backends:(0.006) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email ", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."id" = 1 LIMIT 1; 参数=(1,)
Out[7]: [(1, u'admin', u'Admin', u'User', u'admin@example.com', u'sha1$bf3bc$daa1fb58a8a41e15c730ae86bc0faf4c01fdd3a1', True, True, True, datetime. datetime(2013, 1, 8, 21, 15, 51, 855527), datetime.datetime(2012, 1, 10, 15, 13, 55))]

在 [8] 中:User.objects.get(id=1)
DEBUG:django.db.backends:(0.001) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email ", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."id" = 1 ; 参数=(1,)
出[8]:<用户:管理员>
于 2013-02-02T02:03:07.997 回答