2010-04-14 2 views
0

У меня есть две модели устройства и журнала установки как таковой:Django запрос получить последние записи для каждой записи и отображения в комбинированном списке

class device(models.Model): 
    name = models.CharField(max_length=20) 
    code = models.CharField(max_length=10) 
    description = models.TextField() 

class log(model.Model): 
    device = models.ForeignKey(device) 
    date = models.DateField() 
    time = models.TimeField() 
    data = models.CharField(max_length=50) 

как я могу получить список, который содержит только самую последнюю запись/журнал (на основе даты и время) для каждого устройства и комбинируют их в следующей форме:

имени, код, дата, время, данные

будучи Django новичком я хотел бы реализовать это с помощью ORM Джанго. ТИА!

EDIT:

до сих пор не работает для меня, хотя я попробовал этот подход:

devices=device.objects.annotate(latest_log_date=Max('log_date')),latest_log_time=Max('log_time')) 

logs=get_list_or_404(log.objects.filter(date__in=[b.latest_log_date for b in devices],time__in=[b.latest_log_time for b in devices]))` 

это только дает мне самый последний журнал от каждого устройства ... не объединить оба курса ... но на основе этого, как я могу представить его по имени, коду, дате, времени, формату данных?

ответ

0

Что-то вроде этого:

for d in device.objects.all(): 
    try: 
     l = d.log_set.all().order_by('-date','-time')[0] 
     text = "%s,%s,%s,%s,%s" % (d.name, d.code, l.date, l.time, l.data) 
     #do something with text 
    except: 
     pass 

Try/за исключением является, когда нет журнала не найдено для устройства. Может быть, вам нужно поместить что-то вроде str (d.date), чтобы заставить форматирование работать (или даже лучше, использовать какой-то strftime или что-то подобное, чтобы отдать ему желаемый формат).

+0

Хммм, я получаю объект «функция», не имеет атрибута «order_by» в следующей строке: l = d.log_set.all.order_by ('- date', '- time') [0] – gtujan

+0

it должно быть все(). order_by() Но за исключением: pass antipatter, либо он должен быть зарегистрирован на другом объекте, либо он должен громко рушиться. Вы рискуете бесшумным повреждением данных/системы. – Almad

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