2010-06-08 65 views
0

所以我試圖模仿谷歌應用程序的狀態頁面:http://www.google.com/appsstatus#hl=en,但爲我們自己的服務器備份。服務器名稱不是左邊的,而是服務器名稱,但是日期並希望分頁也會在那裏。我的模型看起來非常相似:Django:按日期和服務器分組

from django.db import models 

STATUS_CHOICES = (
    ('UN', 'Unknown'), 
    ('NI', 'No Issue'), 
    ('IS', 'Issue'), 
    ('NR', 'Not Running'), 
) 

class Server(models.Model): 
    name = models.CharField(max_length=32) 

    def __unicode__(self): 
     return self.name 

class Backup(models.Model): 
    server = models.ForeignKey(Server) 
    created = models.DateField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='UN') 
    issue = models.TextField(blank=True) 

    def __unicode__(self): 
     return u'%s: %s' % (self.server, self.get_status_display()) 

我的問題是,我有一個地獄的時間顯示我需要的信息。每天在午夜之後,cron作業將會運行併爲當天的每臺服務器添加一行,默認爲未知狀態(UN)。

我backups.html:

{% extends "base.html" %} 
{% block content %} 
<table> 
    <tr> 
     <th>Name</th> 
{% for server in servers %} 
     <th>{{ created }}</th> 
    </tr> 
    <tr> 
     <td>{{ server.name }}</td> 
     {% for backup in server.backup_set.all %} 
     <td>{{ backup.get_status_display }}</td> 
     {% endfor %} 

    </tr> 
{% endfor %} 
</table> 
{% endblock content %} 

其實,這工作,但我不知道怎麼弄的日期顯示。顯然{{ created }}不會做任何事情,但服務器沒有創建日期。備份是做的,因爲它是一個cron作業,應該只有X行與任何特定日期(取決於我們當天關注的服務器數量)。

摘要

我想創建一個表,X是服務器的名稱,在開始今天的,而所有的細胞作爲一個備份的狀態Y的日期。上面的模型和模板應該希望給你一個想法,我的思維過程,但我願意改變任何東西。基本上我創建了一個奇特的Excel電子表格。

回答

0

我建議添加一個函數來獲取要顯示的日期,這與服務器實例無關。然後,您可以使用它來獲取最近的備份並獲取標題的日期。在models.py:

from django.db import models 
import datetime 

def recent_dates(): 
    return [datetime.date.today() - datetime.timedelta(days=days) 
      for days in range(-6, 1)] 

class Server(models.Model): 
    ... 
    def backup_for_date(self, date): 
     next_date = date + datetime.timedelta(days=1) 
     return self.backup_set.get(created__gte=date, created__lt=next_date) 

    def recent_backups(self): 
     return [self.backup_for_date(date) for date in recent_dates()] 

然後,如果你在views.py使用功能:

from django.shortcuts import render_to_response 
from myapp.models import Server, recent_dates 

def status(request): 
    servers = Server.objects.all() 
    return render_to_response('status.html', 
     {'dates': recent_dates(), 'servers': servers} 
    ) 

...你可以使用recent_dates變量來打印頭模板:

{% extends "base.html" %} 
{% block content %} 
<table> 
    <tr> 
     <th>Name</th> 
     {% for date in recent_dates %} 
     <th>{{ date }}</th> 
     {% endfor %} 
    </tr> 
    {% for server in servers %} 
    <tr> 
     <td>{{ server.name }}</td> 
     {% for backup in server.recent_backups() %} 
     <td>{{ backup.get_status_display }}</td> 
     {% endfor %} 
    </tr> 
    {% endfor %} 
</table> 
{% endblock content %} 

使用此方法還可以確保如果數據丟失,單元格不會移位。如果數據丟失,我提供的代碼會在backup_for_date()內調用get()方法時引發異常,但在此情況下,可以輕鬆修改backup_for_date()以返回無。