Django에서 추가 (). values ​​() 호출에서 관련 객체를 어떻게 얻습니까?

StackOverflow https://stackoverflow.com/questions/1138360

  •  16-09-2019
  •  | 
  •  

문제

이 게시물에 감사드립니다. Django보기에서 쿼리별로 쉽게 계산하고 그룹화 할 수 있습니다.

Count 및 Group By에 해당하는 Django

내 앱에서하고있는 일은 국가의 데이터베이스에서 사용 가능한 코인 유형과 얼굴 값 목록을 표시하므로 영국의 동전은 "1 Farthing"또는 "6 Pence"의 액면가를 가질 수 있습니다. 그만큼 face_value 6, currency_type 관련 테이블에 저장된 "펜스"입니다.

제 생각에는 다음과 같은 코드가 있습니다.

def coins_by_country(request, country_name):
    country = Country.objects.get(name=country_name)
    coin_values = Collectible.objects.filter(country=country.id, type=1).extra(select={'count': 'count(1)'},
                               order_by=['-count']).values('count', 'face_value', 'currency_type')
    coin_values.query.group_by = ['currency_type_id', 'face_value']
    return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )

그만큼 currency_type_id 외국 키 필드 (IE 4)에 저장된 숫자로 만난다. 내가하고 싶은 것은 쿼리의 일부로 참조하는 실제 객체를 검색하는 것입니다 (통화 모델, 내 템플릿에서 Currency.Name 필드를 얻을 수 있음).

그렇게하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책 2

select_related() 나를 꽤 가까워졌지만 내가 선택한 모든 필드를 추가하기를 원했습니다. group_by 절.

그래서 나는 추가를 시도했다 values()select_related(). 아니야. 그런 다음 쿼리의 다른 위치에서 각각의 다양한 순열을 시도했습니다. 가까이 있지만 꽤 아닙니다.

SQL 쿼리를 작성하는 방법을 이미 알고 있었기 때문에 "Wimping Out"과 Raw SQL을 사용했습니다.

def coins_by_country(request, country_name):
    country = get_object_or_404(Country, name=country_name)
    cursor = connection.cursor()
    cursor.execute('SELECT count(*), face_value, collection_currency.name FROM collection_collectible, collection_currency WHERE collection_collectible.currency_type_id = collection_currency.id AND country_id=%s AND type=1 group by face_value, collection_currency.name', [country.id] )
    coin_values = cursor.fetchall()
    return render_to_response('icollectit/coins_by_country.html', {'coin_values': coin_values, 'country': country } )

Django Queryset Language에서 정확한 쿼리를 표현하는 방법이 있다면 궁금합니다. 나는 SQL이 카운트와 두 개의 열로 그룹화하는 것이 슈퍼라는 것이 아니라고 생각합니다. 따라서 깨끗한 방법이 없다면 놀랄 것입니다.

다른 팁

당신은 그것을 할 수 없습니다 values(). 그러나 그것을 사용할 필요가 없습니다 - 당신은 실제를 얻을 수 있습니다. Collectible 물체, 각각은 다음과 같습니다 currency_type 관련 연결된 객체가 될 속성.

그리고 Justinhamade가 제안한 것처럼 사용합니다 select_related() 데이터베이스 쿼리 수를 줄이는 데 도움이됩니다.

함께 모으고, 당신은 얻을 수 있습니다 :

coin_values = Collectible.objects.filter(country=country.id, 
                    type=1).extra(
                    select={'count': 'count(1)'}, 
                    order_by=['-count']
                ).select_related()

select_related ()를 시도 했습니까? http://docs.djangoproject.com/en/dev/ref/models/querysets/#id4

나는 그것을 많이 사용하여 잘 작동하는 것처럼 보이면 coin_values.currency.name으로 갈 수 있습니다.

또한 필터에서 Country = Country.ID를 수행해야한다고 생각하지 않지만 국가 = 국가만으로도 타이핑이 적은 것 외에 어떤 차이가 있는지 잘 모르겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top