이 문제에 대해 ticket을 열었습니다. 나는이 같은 쿼리를 실행하려면장고에서 관련 모델 및 집계 필드를 필터링하는 해결 방법이 필요합니다.
class Plan(models.Model):
cap = models.IntegerField()
class Phone(models.Model):
plan = models.ForeignKey(Plan, related_name='phones')
class Call(models.Model):
phone = models.ForeignKey(Phone, related_name='calls')
cost = models.IntegerField()
: 여기에 간단히 말해서
내 모델입니다Phone.objects.annotate(total_cost=Sum('calls__cost')).filter(total_cost__gte=0.5*F('plan__cap'))
불행히도 장고가 생성하는 나쁜 SQL :
SELECT "app_phone"."id", "app_phone"."plan_id",
SUM("app_call"."cost") AS "total_cost"
FROM "app_phone"
INNER JOIN "app_plan" ON ("app_phone"."plan_id" = "app_plan"."id")
LEFT OUTER JOIN "app_call" ON ("app_phone"."id" = "app_call"."phone_id")
GROUP BY "app_phone"."id", "app_phone"."plan_id"
HAVING SUM("app_call"."cost") >= 0.5 * "app_plan"."cap"
및 오류 :
ProgrammingError: column "app_plan.cap" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: ...."plan_id" HAVING SUM("app_call"."cost") >= 0.5 * "app_plan"....
원시 SQL을 실행하는 것과는 다른 대안이 있습니까?
감사합니다. c. 나는 그것을 줄 것이다. – parxier
''app_plan "."GROUP BY' 절의 "cap"다음에있었습니다. – parxier
'Avg ('plan__cap')'이 (가) 트릭을했습니다. 고마워, C! – parxier