복잡한 데이터베이스 모델을 장고에서 설정하고 필터 데이터를 기반으로 여러 계산을 수행해야합니다. 나는 Test
오브젝트, TestAttempt
오브젝트 및 UserProfile
오브젝트 (테스트 할 외부 키와 다시 userprofile 로의 외래 키 포함)를 가지고 있습니다. 테스트 점수를 계산하는 TestAttempt
에서 실행하는 방법이 있습니다 (각 테스트와 관련된 정답과 비교하여 사용자가 제공 한 선택 항목 수에 따라 다름). 그리고 각각의 TestAttempt
에 따라 평균 테스트 점수를 계산하는 Test
에서 실행하는 또 다른 방법입니다.하지만 때로는 특정 세트와 연결된 TestAttempt
의 제공된 하위 집합을 기준으로 평균을 원합니다. UserProfiles
입니다. 따라서 특정 테스트에 대한 평균 테스트 점수를 다음과 같이 계산하는 대신에 :django의 효율성 쿼리 세트에 대한 __in 조회
[x.score() for x in self.test_attempts.all()]
이러한 평균값을 계산하면됩니다. 이 같은 쿼리를 수행
user_id_list
내가 목록의 형태로 평균 시험 점수를 발견하고자하는 사용자 프로필 아이디의 특정 부분 집합이다
[x.score() for x in self.test_attempts.filter(profile__id__in=user_id_list).all()]
. 내 질문은 이것입니다 : user_id_list
참으로 UserProfile
의 전체 집합 (따라서 필터는 self.test_attempts.all()
같은 반환합니다) 및 대부분의 시간이 사건이 될 것입니다,이 경우를 확인하기 위해 지불합니까, 그렇다면 필터를 전혀 실행하지 않습니까? 또는 __in 조회가 효율적이기 때문에 user_id_list
에 모든 사용자가 포함되어 있어도 필터를 실행하는 것이 더 효율적입니다. 또한 결과 test_attempts를 distinct()로 만드는 것에 대해 걱정할 필요가 있습니까? 아니면 내 쿼리 세트의 구조로 중복을 표시 할 수 없습니까?
편집 : 필터와
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" WHERE "mc_grades_testattempt"."test_id" = 1
이 :
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" INNER JOIN "mc_grades_userprofile" ON
("mc_grades_testattempt"."student_id" = "mc_grades_userprofile"."id") WHERE
("mc_grades_testattempt"."test_id" = 1 AND "mc_grades_userprofile"."user_id" IN (1, 2, 3))
노트 배열이 원시 SQL 쿼리보고에 관심있는 사람의 경우, 필터를 사용하지 않고 다음과 같습니다 (1,2,3)은 단지 예제 일뿐입니다.
두 경우 모두 생성되는 SQL은 무엇입니까? –
확실하지 않은 경우 특정 쿼리 집합에 대해 SQL을 출력하는 방법은 무엇입니까? 편집, 알아 냈어. 그 순간을 알기 위해 – ecbtln
SQL 쿼리가 추가되었습니다. – ecbtln