2010-09-22 2 views
0

Допустим, у меня есть следующие модели в приложении Django.Как объединить записи в django на основе нескольких критериев

class EventGroup 
    name = models.CharField() 

class Event(models.Model): 
    name = models.CharField() 
    group = models.ForeignKey(EventGroup) 

class Severity(models.Model): 
    name = models.CharField() 
    group = models.ForeignKey(EventGroup) 

class LogEntry(models.Model): 
    timestamp = models.DateTimeField(auto_now_add=True) 
    event = models.ForeignKey('Event') 
    severity = models.ForeignKey('Severity') 

Каков оптимальный способ поиска последних записей журнала каждой серьезности для каждого события в группе? То есть, если у меня есть группа событий с некоторыми серьезностями и некоторыми связанными с ней событиями, я бы ожидал получить список последних записей журнала для каждой комбинации серьезности и события.

ответ

0

Самый прямой путь будет что-то вдоль линий:

groups = EventGroup.objects.all() 
for group in groups: 
    for event in group.event_set.all(): 
     LogEntry.objects.filter(event = event).latest('timestamp') 

Это ударит к базе данных несколько раз.

Другой способ - начать с модели LogEntry. Такой подход требует меньше запросов.

groups = EventGroup.objects.all() 
for group in groups: 
    LogEntry.objects.select_related().filter(event__group = group).latest('timestamp') 

Предупреждение: Я не тестировал этот код. Это работает для меня.

+0

Извините, но я пропустил немного структуры при описании моделей (см. Отредактированный код). Я пытался сделать то же самое, что и вы предлагали с вложенными циклами, но это кажется медленным. Любые альтернативы? –

+0

@Mad Wombat: как насчет второго варианта, где вы начинаете с 'LogEntry'? Это было лучше? –

+0

Не совсем. Кажется, что вложенные циклы убивают производительность, поскольку даже во второй версии кода основной запрос выполняется для каждой итерации. Я пытаюсь понять либо функциональный подход к этому, либо использовать API Django QuerySet каким-то творческим способом. –

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