Property w modelach Django, czyli sposób na dynamiczne pola

Property w modelach Django, czyli sposób na dynamiczne pola

Z czasem, gdy nasze modele się rozrastają, rosną nasze potrzeby związane z bardziej skomplikowanymi zależnościami między danymi. Zaczynamy od zupełnie prostych pól, przechowujących podstawowe dane, takie jak imię, nazwisko czy data urodzenia. W pewnym momencie chcemy jednak mieć możliwość obliczania wieku dynamicznie. Z pomocą przyjdzie nam dekorator property.

Innym przykładem może być użycie property do wyświetlania danych w innej formie lub dodania do nich stałych składowych. Poniżej przykład klasy do generowania linków przekierowujących:

#models.py
class Link(models.Model):
url = models.URLField()
alias = models.CharField(max_length=20)

@property
def generated_url(self):
return '/l/' + str(self.alias)

Ale po co nam w ogóle to property? Nie wystarczy nam użycie 'generated_url' jako funkcji?

Dekorator property pozwala traktować wywołaną funkcję jako pole. Ma to świetne zastosowanie, jeśli chcemy skorzystać z jej wartości w panelu administracyjnym (przykład poniżej) lub w szablonie:

#admin.py
class LinkAdmin(admin.ModelAdmin):
list_display = ['alias', 'url_to_copy', 'url']
readonly_fields = ['url_to_copy']

admin.site.register(Link, LinkAdmin)

"list_display" pozwala nam zdefiniować, które pola modelu chcemy wyświetlić w panelu administracyjnym.
"readonly_fields" służy do określania, które pola są wyświetlą się w panelu administracyjnym tylko do odczytu.

0 Komentarze

Skomentuj