Django:按日期和服务器分组

时间:2010-06-08 17:55:00

标签: sql django sqlite models

所以我试图模仿谷歌应用的状态页面:http://www.google.com/appsstatus#hl=en但是我们自己的服务器的备份。而不是左边的服务名称,它将是服务器名称,但日期和希望分页也将在那里。我的模型看起来非常相似:

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电子表格。

1 个答案:

答案 0 :(得分:0)

我建议添加一个函数来获取要显示的日期,这与Server实例无关。然后,您可以使用它来获取最近的备份并获取标头的日期。在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 %}

如果数据丢失,使用此方法还可确保单元格不会移位。如果数据丢失,我提供的代码将在get() backup_for_date()内的backup_for_date()方法调用中引发异常,但在这种情况下可以轻松修改{{1}}以返回None。