2012-02-16 2 views
2

일부 모델의 일일 레코드를 계산하려고하지만 몇 가지 fk 필드 = xy가있는 레코드에 대해서만 카운트가 만들어지기를 바랍니다. 그래서 새로운 레코드가 생성 된 일 0django annotate count filter

class SomeModel(models.Model): 
    place = models.ForeignKey(Place) 
    note = models.TextField() 
    time_added = models.DateTimeField() 

이 장소 이름 = "뉴욕"과의

data = SomeModel.objects.extra({'created': "date(time_added)"}).values('created').annotate(placed_in_ny_count=Count('id')) 

이 작동하지만, 모든 기록 .. 모든 장소를 보여줍니다 말 반환 할 수 있습니다.

필터링을 시도했지만 place.name="NewYork"이 (가)없는 레코드가있는 일을 반환하지 않습니다. 그건 내가 필요로하는 것이 아니다.

+0

필터링과 함께 코드를 표시하고 결과를 보여 주며 잘못되었다고 생각할 수 있습니까? –

+0

@GarethRees'data = SomeModel.objects.extra ({created} : 날짜 (time_added)}}) 값 ('created') 주석 (배치 된 '_ny_count = 카운트 ('id'))'' '.filter (place = Place.objects.get (name = 'NewYork'))'를 추가하면 'place'가있는 SomeModel 레코드가 생성 된 날 만 반환되기 때문에 반환되는 횟수가 줄어 듭니다. 나는 그러한 기록이없는 날들을 돌려주고 싶다. 나는'ny_counts = Count ('id'where place = Place.objects.get (name = 'NewYork'))'와 같은 것을하고 싶고'{{placed_in_ny_count ': 23,'created ': datetime.date (2012,1,12)}, { 'placed_in_ny_count': 0, 'created': datetimedate (2012,1,13)} ...]' – Robert

답변

1

개체가 추가 된 날마다 생성 된 개체 중 그 개체의 뉴욕에 이름이 지정된 개체가 얼마나 많은지 알고 싶은 것처럼 보입니다. (내가 잘못 이해 한 경우 알려주세요.) SQL에서, outer join 필요로한다 :

for o in SomeModel.objects.raw('SELECT ...'): # query as above 
    print 'On {0}, {1} objects were added in New York'.format(o.created, o.count) 

참고 :

SELECT m.id, date(m.time_added) AS created, count(p.id) AS count 
    FROM myapp_somemodel AS m 
    LEFT OUTER JOIN myapp_place AS p 
     ON m.place_id = p.id 
     AND p.name = 'New York' 
    GROUP BY created 

그래서 당신은 항상 raw SQL query를 사용하여 장고에이 표현할 수

  1. 장고의 쿼리 언어로 표현할 수 있다면 해결하지 못했습니다. 이 수 있지만 as the developers say 수, 데이터베이스 API는 "바로 가기 그러나 반드시 엔드 - 모두 - 수 - 모든"입니다.)

  2. m.id는 SQL 쿼리에서 불필요한이지만, Django requires 기본 키 "그. .. 항상 원시 쿼리에 포함되어야합니다. "

  3. 'New York'을 쿼리에 쓰고 싶지 않으므로 pass a parameter 대신 raw('SELECT ... AND p.name = %s ...', [placename])을 입력하십시오.