151

djangoproject.comのこのチケットとほとんど同じことをしたいのですが、いくつか追加の書式設定をしています。このクエリから

>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]

私はそのようなものを取得したい:

>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]

別のより組み込みの方法がありますか、それとも手動で行う必要がありますか?

4

6 に答える 6

244

annotatedjango>=1.8と F オブジェクトを使用できます

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')

また、 djangoのドキュメントextra()から、非推奨になる予定です:

これは、将来のある時点で非推奨にすることを目指している古い API です。他のクエリセット メソッドを使用してクエリを表現できない場合にのみ使用してください。それを使用する必要がある場合は、クエリセット API を拡張して extra() を削除できるように、ユースケースで QuerySet.extra キーワードを使用してチケットを提出してください (最初に既存のチケットのリストを確認してください)。このメソッドのバグの改善や修正は行われなくなりました。

于 2015-09-15T08:14:11.860 に答える
80

extra少しハックですが、次の方法を使用できます。

MyModel.objects.extra(
  select={
    'renamed_value': 'cryptic_value_name'
  }
).values(
  'renamed_value'
)

これは基本的SELECT cryptic_value_name AS renamed_valueにSQLで行います。

別のオプションとして、名前を変更したバージョンが常に必要であるが、データベースに不可解な名前がある場合は、フィールドに新しい名前を付けますがdb_column、データベース内の元の名前を参照するために使用します。

于 2012-05-15T10:45:04.410 に答える
-6

モードのいくつかのフィールドの名前を変更したい場合は、もっと簡単です。

試す

projects = Project.objects.filter()
projects = [{'id': p.id, 'name': '%s (ID:%s)' % (p.department, p.id)} for p in projects]

ここでは、テーブルにフィールドがありませんがname、少し調整すると取得できます。

于 2014-07-21T11:42:14.763 に答える