2010-04-23 3 views
0

최신 sqlserver_ado 라이브러리를 사용하여 SQL Server 2005 db에서 Django 1.1.1을 사용하고 있습니다.SQL 오류를 생성하는 Django 집계 쿼리

models.py이 포함됩니다 :

뷰에서
class Project(models.Model): 
    name = models.CharField(max_length=50) 

class Thing(models.Model): 
    project = models.ForeignKey(Project) 
    reference = models.CharField(max_length=50) 

class ThingMonth(models.Model): 
    thing = models.ForeignKey(Thing) 
    timestamp = models.DateTimeField() 
    ThingMonthValue = models.FloatField() 

    class Meta: 
     db_table = u'ThingMonthSummary' 

, 나는 25 가지 포함 '일'이라는 검색어 세트를 검색 한 :

things = Thing.objects.select_related().filter(project=1).order_by('reference') 

을 내가 다음에 집계 쿼리를 수행 할 특정 기간 동안 처음 20 개 항목에 대해 평균 ThingMonthValue를 가져오고 마지막 5 자리에 대해 동일한 값을 가져옵니다.

처음 20 일 경우 :

averageThingMonthValue = ThingMonth.objects.filter(thing__in=things[:20],timestamp__range="2009-01-01 00:00","2010-03-00:00")).aggregate(Avg('ThingMonthValue'))['ThingMonthValue__avg'] 

이 작동하고 원하는 값을 반환합니다.

averageThingMonthValue = ThingMonth.objects.filter(thing__in=things[20:],timestamp__range="2009-01-01 00:00","2010-03-00:00")).aggregate(Avg('ThingMonthValue'))['ThingMonthValue__avg'] 

을하지만 내가는 SQL 오류 얻을 : 지난 5

내가 할 '. 하나의 표현이 EXISTS와 하위 쿼리가 도입되지 않을 때 선택 목록에서 지정 될 수 있습니다' 장고에 의해 사용되는

SQL 쿼리

SELECT AVG([ThingMonthSummary].[ThingMonthValue]) AS [ThingMonthValue__avg] 
FROM [ThingMonthSummary] 
WHERE ([ThingMonthSummary].[thing_id] IN 
    (SELECT _row_num, [id] FROM (SELECT ROW_NUMBER() OVER (ORDER BY [AAAA].[id] ASC) as _row_num, 
    [AAAA].[id] FROM (SELECT U0.[id] FROM [Thing] U0 WHERE U0.[project_id] = 1) AS [AAAA]) as QQQ 
    where 20 < _row_num) AND [ThingMonthSummary].[timestamp] BETWEEN '01/01/09 00:00:00' and '03/01/10 00:00:00') 

가 하나 개 것들의 조각이 아닌 초 동안 작동 왜 어떤 생각? 나는 체크했다. 그리고 2 개의 조각은 원하는 물건을 바르게 포함한다.

답변

2

이것은 Django ORM의 SQL 생성기 버그입니다. 생성 된 SQL은 두 번째 쿼리의 IN 하위 쿼리에 과 id을 반환하는 데 필요하지 않을 때이를 반환합니다. 서브 쿼리는 SELECT TOP 20...

로 기록 될 수 있기 때문에

는 지난 N 행 계산이 해결하기 위해, 처음 20 계산에 필요하지 않을 것입니다, 당신은 Things의 해제 집계 집합을 반환 할 수 코드에서 평균 계산을 수행합니다.

가 (다른 장고 특정 솔루션이있을 수 있습니다,하지만 난 SQL 서버 사람입니다.)

+0

이 내가 무슨 짓을했는지 기본적으로, 그것은 추한지만 작동합니다. 나는 sqlserver_ado 관리자들과 티켓을 모으기 때문에 잘하면이 문제가 해결 될 것이다. 감사! – meepmeep