에 따라 단순화 된 내 모델의 버전 카운트 또는 그가 소유 한 Flight
오브젝트의 destination
필드에 각각 대응하는 Flight
오브젝트의 주석이 붙습니다.는 다음 조건
예를 들어 사용자가 3 번 비행 한 경우 (LAX-LHR
, LHR-CDG
및 CDG-JFK
)를 가정합니다. 그럼 난 다음 개체를 반환하는 쿼리 싶습니다 위에서
[LHR, id__count=2}, {CDG, id__count=2}, {LAX, id__count=1}, {JFK, id__count=1}]
을, 세 개의 문자 코드는 Airport
개체 또는 모든 필드에 서있다.
일반적으로, User
의 수천 Airport
들과 Flight
의 수만있을 수있다, 그래서 바람직하게는 단일 데이터베이스 쿼리에, for 루프와 문 경우 확실한 해결책보다 더 효율적 무언가를 추구하고있다. 초기 filter
는 자신의 항공편을 어딘가에 표시하는 공항을 유지하기 때문에
Airport.objects.filter(
Q(origins__owner=user) | Q(destinations__owner=user)
)
.distinct()
.annotate(
id__count=Count('origins', distinct=True) + Count('destinations', distinct=True)
).order_by('-id__count')
이 단 하나의 사용자와 완벽하게 작동합니다 :
나의 현재 진행이 쿼리입니다. 그러나 여러 사용자가있을 경우 모든 사용자의 항공편이 포함되므로 분명히 실패합니다. 단지 Count
에 어떤 방법이 필요합니다. owner=user
이 인 특정 User
개체 인 특정 속성을 따르는 객체 인 Flight
입니다.
편집 : this page in the Djnago documentation를 읽은 후, 필요에 따라 먼저 필터 퍼팅이 일을해야 것 같다. 하지만 적어도 Q 객체를 사용할 때는 그렇지 않습니다. 다음과 같이 매우 혼란스러운 결과를 발견했습니다. 이 정확히 내가 무엇을하지 않습니다 (
Airport.objects.filter(origins__owner=user).annotate(num_origins=Count('origins'))
:이 쿼리를 사용하는 경우
, 즉 오직 다음 작동, 기원을보고하고, num_origins
필드 수는 만 항공편은 user
지정에 속하는 나는 아무것도 할 수 없지만, 또는 결합 된 두 개의 Q 객체에 단일 필터를 교체 할 때
Airport
입니다 항공편을 포함하기 때문에 필요하지만, 제대로
User
의 필터링 않습니다.)
을하지만,
Airport.objects.filter(Q(origins__owner=user) | Q(destinations__owner=user)).annotate(num_origins=Count('origins'))
이제 모든 사용자가 속한 항공편을 계산합니다! 주석 객체는 Q 객체를 사용할 때 필터에 대해 "잊어 버린"것처럼 보입니다. 여기서 무슨 일이 일어나고있는거야?
가 왜 비행 개체의 소유자 키에 대한 관련 이름을 추가하지 않은 : 당신이 장고 (2)를 사용하는 경우
Count
에 필터 인수를 전달할 수 있기 때문에는, 그것은 여전히 간단하다? 그런 다음 모든 사용자의 항공편을 가져 와서 별개의 광고를 적용하여 별개의 항공편 수만 사용할 수 있습니다. –
@ChağatayBarın 소유자 필드에 대한 관련 이름을 추가했지만 사용 방법을 여전히 볼 수 없습니다. 좀 더 설명해 주시겠습니까? 감사. – jc315