Django에서 values ​​() 항목의 이름을 바꾸는 방법은 무엇입니까?


101

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

다른 기본 제공 방법이 있습니까 아니면 수동으로 수행해야합니까?

답변:


72

약간 해키하지만 다음 extra방법을 사용할 수 있습니다 .

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

이것은 기본적으로 SELECT cryptic_value_name AS renamed_valueSQL에서 수행됩니다.

다른 옵션은 항상 이름이 바뀐 버전을 원하지만 db에 알 수없는 이름이있는 경우 새 이름으로 필드 이름을 지정하지만 db_columndb의 원래 이름을 참조하는 데 사용 하는 것입니다.


6
분명히 1.7. *에서는 별칭이 지정된 이름을 values(). 출처 : code.djangoproject.com/ticket/16735
gregoltsov

19
-1 왜냐하면 .values(supports__through_tables)이 해킹은 그렇지 않기 때문입니다 (부수적으로 ValuesQuerySet딕셔너리 키의 이름을 바꾸려는 가장 명백한 사용 사례 일 것입니다 )
wim

1
누구든지 테이블 (.values ​​(supports__through_tables))을 통해 이것을 수행하는 방법을 찾았습니까?
François Constant

12
안타깝게도이 솔루션은 .values('foreignkeymodel__id', 'foreignkeymodel__name').
Risadinha 2014 년

13
티켓 16735의 Model.objects.annotate (my_alias = F ( 'some__long__name__to__alias')). values ​​( 'my_alias')
유진

188

에서 django>=1.8당신은 주석과 F 객체를 사용할 수 있습니다

from django.db.models import F

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

또한 django 문서extra() 에서 더 이상 사용되지 않을 것입니다 .

이는 향후 언젠가는 지원 중단하려는 오래된 API입니다. 다른 queryset 메서드를 사용하여 쿼리를 표현할 수없는 경우에만 사용하십시오. 이를 사용해야하는 경우 사용 사례와 함께 QuerySet.extra 키워드를 사용하여 티켓을 제출하십시오 (먼저 기존 티켓 목록을 확인하십시오). 그러면 extra ()를 제거 할 수 있도록 QuerySet API를 향상시킬 수 있습니다. 더 이상이 방법에 대한 버그를 개선하거나 수정하지 않습니다.


3
이 답변은 django>=1.8. annotate집계 이외의 표현식을 허용하는 쿼리 표현식이 활성화 되었습니다. 참조 : docs.djangoproject.com/en/1.9/releases/1.8/…
Yeo

3
작동하지만 원래 질문에서 제안 된 구문 이 훨씬 더 멋지지 않습니까? MyModel.objects.values(renamed_value='cryptic_value_name')
wim

11
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))작품
jarcoal

1
이 답변은 작동하지만 중복됩니다. 전달 된 키워드 인수는 사용자를 대신하여 values()전달됩니다 annotate()( docs.djangoproject.com/en/2.2/ref/models/querysets/… 참조 ). 에 대한 답 MyModel.objects.values(renamed_value=F('cryptic_value_name'))은 더 간단하고 명확합니다.
tobias.mcnulty

76

다른 관리자 방법을 사용하지 않고 (에서 테스트 됨 v3.0.4) :

from django.db.models import F

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

Django 문서 에서 발췌 :

F () 객체 모델 필드 또는 주석 열의 값을 나타낸다. 모델 필드 값을 참조하고 실제로 데이터베이스에서 Python 메모리로 가져 오지 않고도이를 사용하여 데이터베이스 작업을 수행 할 수 있습니다.


5
둘 이상의 값에 대해 다음을 사용할 수 있습니다.MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
alpere

1
하지만 한 값 을 변경 하고 다른 값을 유지 하려면 어떻게해야합니까? 주석을 달면 가능 inv.annotate(name=F('stock__name')).values('name', "price")하지만이 방법이이 경우 어떻게 작동해야하는지 모르겠습니다. inv.values(name=F("stock__name"), price=F("price"))-> '가격'주석이 모델의 필드와 충돌합니다
Malte

1
@Malte 나는 이것을 복잡하게 할 필요가 없다고 생각합니다. 그냥 시도하십시오 inv.values('price', name=F("stock__name")). 파이썬에서는 명명되지 않은 인수 뒤에 명명 된 인수 만 넣을 수 있습니다.
Arpit Singh

0

나는 django 1.11.6으로 작업하고 있습니다.

(그리고 key : value 쌍은 수락 된 대답의 쌍과 반대입니다)

이것이 내 프로젝트에서 작동하도록 만드는 방법입니다.

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

simultanous objects.filter (). extra (). values ​​()를 추가하는 것은 위와 같습니다.


.extra(select={cryptic_value:ranamed_value})수락 된 답변과 비교하여 반대 key : value가 있음 을 알 수 있습니다
Sudip Bhattarai

-6

모드의 몇 가지 필드의 이름을 바꾸려면 간단합니다.

시험

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

여기 name에는 테이블에 필드가 없지만 조금 조정하면 얻을 수 있습니다.


10
–1 딜 브레이커 인
wim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.