Relacje bazy danych na poziomie ORM w Django

Cały czas odkrywam coś nowego w Django. Luke Plant ma rację, że te wszystkie opowiadania o blogu w 20 minut, to zwykła propaganda.

Jest to tylko o tyle prawdą, że czas poświęcony na poznawanie Django zostanie odzyskany z nawiązką w przyszłości. Ale dopóki się Django nie zna dobrze, czas pracy nad serwisem jest dłuższy niż gdyby go napisać w php używając kodu pogardliwie określanego nazwą pewnej włoskiej potrawy. Takiego kodu oczywiście pisać nie należy i wierzę, że noce spędzone nad django nie są inwestycją daremną.

Tym razem "odkryłem" bajeczną po prostu właściwość obiektów Pythona reprezentujących modele bazy danych. Otóż relacje jeden do wielu (a także jeden do jeden i wiele do wielu) są zrobione tak, że w obiekcie siedzi nie tyle "identyfikator" obiektu powiązanego (jak to jest w tabelach) ale odwołanie do samego obiektu! Na przykład:

class Person(models.Model):
    name = models.CharField(max_length=30, verbose_name='Nazwisko')
    firstname = models.CharField(max_length=30, verbose_name='Imię')
    class Meta:
        verbose_name = "Osoba"
        verbose_name_plural="Osoby"
    def __unicode__(self):
        return self.firstname + ' '+ self.name
 
class List(models.Model):
    login = models.CharField(max_length=50,  verbose_name='Nazwa użytkownika')
    password = models.CharField(max_length=50,  verbose_name='Hasło')
    used =  models.OneToOneField(Person)
    def __unicode__(self):
        return self.login

I teraz

ja = Person(name="Jędryka", firstname="Michał")
l = List(login="alfa", password="beta")

I to co mnie przyprawiło o euforię - nie jest

l.used = ja.id
ale jest
l.used= ja

Przykład jest może i abstrakcyjny, ale za to jasny ;)