1

単一のインスタンス (例: ) のモデルを照会したいid=1のですが、単一のフィールド ( ) の値のみを返したいです'title'。次のクエリでこれを実現できます。

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

しかし、 agetは a よりも効率的ですfilter。ただし、クエリでは機能values_listvaluesません。get理想的には、私はこれを行うことを好みます:

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

しかし、次のエラーが表示されます。AttributeError: SomeModel has no attribute 'title'

このクエリを記述する最良の方法は何ですか?

4

1 に答える 1

3

しかし、 agetは a よりも効率的ですfilter

これは単に真実ではありません。は、とまったく同じ SQL.get(…)を生成します。.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,)
Out[8]: <ユーザー: 管理者>
于 2013-02-02T02:03:07.997 に答える