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

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



답변

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

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

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

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


답변

에서 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를 향상시킬 수 있습니다. 더 이상이 방법에 대한 버그를 개선하거나 수정하지 않습니다.


답변

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

from django.db.models import F

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

Django 문서 에서 발췌 :

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


답변

나는 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 ​​()를 추가하는 것은 위와 같습니다.


답변

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

시험

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

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


답변