web-dev-qa-db-ja.com

Djangoのvalues()のアイテムの名前を変更する方法は?

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}]

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

81
Martin

それは少しハックですが、 extra メソッドを使用できます:

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

これは基本的にSELECT cryptic_value_name AS renamed_valueのSQL。

別のオプションは、常に名前を変更したバージョンが必要であるが、dbの名前が暗号化されている場合、フィールドに新しい名前を付けて db_column dbの元の名前を参照します。

58
Daniel Roseman

_Django>=1.8_から、注釈とFオブジェクトを使用できます

_from Django.db.models import F

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

また、extra()は、 Django docs: から非推奨になります

これは古いAPIであり、将来のある時点で廃止される予定です。他のquerysetメソッドを使用してクエリを表現できない場合にのみ使用してください。使用する必要がある場合は、QuerySet.extraキーワードを使用してユースケースを使用してチケットを提出してください(最初に既存のチケットのリストを確認してください)。この方法のバグの改善や修正は行っていません。

146
alejandrodnm

他のマネージャーメソッドを使用せずに(v2.0.8でテスト済み):

from Django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))
50
Arpit Singh

私はDjango 1.11.6

(そして、キーと値のペアは、受け入れられた答えの反対です)

これは私が自分のプロジェクトでそれを機能させる方法です

def json(university):
    address = UniversityAddress.objects.filter(university=university)
    address = address.extra(select={'city__state__country__name': 'country', 'city__state__name': 'state', 'city__name': 'city'})
    address = address.values('country', 'state', "city", 'street', "postal_code").get()
    return address

同時のobjects.filter()。extra()。values()の追加は上記と同じであることに注意してください。

0
Sudip Bhattarai