"Nächste Geburtstage" Snippet
Veröffentlich am 08.11.2008, 18:24
Ein kurzes Snippet zum Anzeigen der nächsten Geburtstage.
Dieser Codeausschnitt benötigt ein Profile Model mit einem birthday Feld (DateField oder DateTimeField) sowie einem ForeignKey auf django.contrib.auth.models.User mit dem Namen user.
Die Methode nimmt als Mengen-Parameter amount an, standardmäßig ist 5 gesetzt. Als Rückgabewert wird eine Liste mit den django.auth.models.User Objekten ausgegeben.
from myproject.accounts.models import Profile
import datetime
def next_birthdays(amount=5):
birthdays = {}
for profile in Profile.objects.select_related('user'):
birthdays.setdefault((profile.birthday.month, profile.birthday.day), []).append(profile.user)
dates = birthdays.keys()
dates.sort()
for i, date in enumerate(dates):
if date >= (datetime.date.today().month, datetime.date.today().day):
total = len(dates)
first_pos = total - i
break
sorted_birthdays = dates[total - first_pos:]
sorted_birthdays.extend(dates[:total - first_pos])
output = []
for date in sorted_birthdays:
for user in birthdays[date]:
output.append(user)
if len(output) >= amount:
return output
return output
Es wird nur ein Datenbank Query abgefragt jedoch ist die Funktion relativ rechenintensiv. Ich empfehle hier unbedingt, die Ausgabe zu cachen.