Seite 1 von 1

Getter für properties von Django Models?

Verfasst: Mittwoch 14. Oktober 2020, 11:37
von skirnir
Hallo,

Es könnte sein, daß mein Problem eher in "Allgemeine Fragen" gehört. Da meine "Problemklassen" aber Django Models sind, habe ich mich entschieden es hier zu posten.
Ich bin gerade dabei, ein Django Projekt auf Django 3.x zu upgraden. Die existierende Applikation wurde in Python 2 geschrieben. Meine aktuelle Baustelle sind Models, die so etwas enthalten:

Code: Alles auswählen

bla = models.FloatField('Beschreibung', null=True)
Später gibt es dann solche Checks:

Code: Alles auswählen

if self.bla > 0:
   # do something
Das funktioniert unter Python 2 wie erwartet, Python 3 liefert an der Stelle einen TypeError, wenn self.bla den Wert None hat.
Da die Datenbank noch von anderen Instanzen der Applikation benutzt wird, kann ich nicht einfach 'null=False' setzen und den Datenbestand verändern, ohne weitere Probleme zu riskieren.

Es wäre schön, wenn es eine Möglichkeit gäbe, da einen Getter zu schreiben, der so aussieht:

Code: Alles auswählen

def get_bla(self):
    if self.bla is None:
        return 0
    return self.bla
und der beim Aufruf von 'self.bla' benutzt wird.

Meine bisherigen Recherchen ergeben, dass ich wohl mit so etwas am nächsten ran komme:

Code: Alles auswählen

@property
def encapsulated_bla(self):
    if self.bla is None:
        return 0
    return self.bla
Das wäre unschön, weil ich dann im gesamten Projekt lesende Zugriffe auf 'bla' editieren müsste.
Gibt es dafür eine elegantere Lösung?

Re: Getter für properties von Django Models?

Verfasst: Mittwoch 14. Oktober 2020, 11:56
von Sirius3
Du mußt halt bla umbenennen, damit Du bla als Property benutzen kannst.

Code: Alles auswählen

_bla = models.FloatField('Beschreibung', null=True)

...

@property
def bla(self):
    return self._bla if self._bla is not None else 0

Re: Getter für properties von Django Models?

Verfasst: Mittwoch 14. Oktober 2020, 12:53
von skirnir
Danke für den Denkanstoß!
Falls jemand den Thread später findet:

Die Deklaration muss dann so aussehen, damit Django die Spalte in der zugehörigen Tabelle findet:

Code: Alles auswählen

_bla = models.FloatField('Beschreibung', null=true, db_column='bla')

Re: Getter für properties von Django Models?

Verfasst: Mittwoch 14. Oktober 2020, 13:05
von __blackjack__
@skirnir: Wobei das natürlich nur geht wenn nirgendwo im Code die Unterscheidung zwischen eine Wert der da und 0 ist und einem nicht vorhandenen Wert gemacht werden darf, denn das geht ja nun nicht mehr.

Re: Getter für properties von Django Models?

Verfasst: Mittwoch 14. Oktober 2020, 13:22
von skirnir
@__blackjack__: Ja, das stimmt natürlich. Muss ich im Hinterkopf behalten. Danke.