Django:如何使用values_list属性编写GET查询?
我想查询一个模型中的单个实例,比如说 id=1
,但我只想返回一个字段的值,也就是 'title'
。我可以用下面这个查询来实现:
SomeModel.objects.filter(pk=1).values_list('title', flat=True)
不过,使用 get
方法比 filter
方法更高效。但是,values_list
和 values
不能和 get
一起使用。理想情况下,我希望这样做:
SomeModel.objects.get(pk=1).values_list('title', flat=True)
但是我遇到了一个错误:AttributeError: SomeModel has no attribute 'title'
那么,写这个查询的最佳方法是什么呢?
1 个回答
3
但是,
get
比filter
更高效。
这根本不对。.get(…)
生成的SQL和.filter(…)
是完全一样的。
使用:
SomeModel.objects.filter(pk=1)[0:1].values_list('title', flat=True)
这样做可以达到你想要的效果,并且性能和.get(…)
是完全一样的(实际上,它会稍微快一点,因为.get(…)
会检查是否会返回多于一行数据……):
In [4]: import logging In [5]: l = logging.getLogger("django.db") In [6]: l.setLevel(logging.DEBUG) In [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; args=(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))] In [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 ; args=(1,) Out[8]: <User: admin>