2012-02-16 2 views
2

Я пытаюсь подсчитать дневные записи для некоторой модели, но я хотел бы, чтобы счет был сделан только для записей с некоторым полем fk = xy, поэтому я получаю список с днями, когда была создана новая запись, но некоторые может возвращать 0.django annotate count filter

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

Say Там есть место с именем = "NewYork"

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':" date (time_added) "}). Values ​​('created'). Annotate (place_in_ny_count = Count ('id'))' 'len (data) 'дает 153. Добавление' .filter (place = Place.objects.get (name = 'NewYork')) 'возвращает меньше, поскольку возвращает только дни, когда была создана запись SomeModel с« местом ». Я хочу, чтобы дни без таких записей тоже возвращались. Я хотел бы сделать что-то вроде 'ny_counts = Count ('id' где place = Place.objects.get (name = 'NewYork'))' и get '[{'placement_in_ny_count': 23, 'created': datetime.date (2012,1,12)}, {'placement_in_ny_count': 0, 'created': datetimedate (2012,1,13)} ...] ' – Robert

ответ

1

Похоже, что вы хотите знать, за каждый день, на который был добавлен объект, сколько объектов, созданных в этот день, имеет место, имя которого - Нью-Йорк. (Дайте мне знать, если я не понял.) В SQL, который нуждается в outer join:

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 

Таким образом, вы всегда можете выразить это в Django используя raw SQL query:

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) 

Примечания:

  1. Я не пробовал работать, если это выражается в языке запросов Django; это может быть, но as the developers say, то API базы данных «ярлык, но не обязательно конец все-быть-все»).

  2. m.id излишни в запросе SQL, но Django requires, что «первичный ключ. .. всегда должны быть включены в необработанный запрос ».

  3. Вы, вероятно, не хотите писать буквально 'New York' в свой запрос, поэтому вместо pass a parameter: raw('SELECT ... AND p.name = %s ...', [placename]).

Смежные вопросы