Warstwa modelu Pytigona rozszerza ORM Django o potężną klasę bazową opartą na JSON oraz bogaty zestaw metod-haków. Klasa JSONModel to fundament, na którym wszystkie aplikacje Pytigona budują swoje struktury danych.
Każdy model Pytigona dziedziczy po JSONModel, która dodaje pole JSON jsondata i zestaw metod zachowania:
from django.db import models
from pytigon_lib.schdjangoext.models import JSONModel
class MyTable(JSONModel):
name = models.CharField(max_length=128)
jsondata = models.JSONField(null=True, blank=True, editable=False)
Pole jsondata przechowuje elastyczne dane bez schematu, które mogą ewoluować bez migracji bazy danych. Służy też jako backend przechowywania dla dynamicznego systemu formularzy Pytigona.
Te metody, zdefiniowane na Twoim modelu, wpinają się w potok przetwarzania widoków i formularzy Pytigona:
get_form_source(self) → strZwraca definicję FastForm w postaci tekstu. Pytigon używa jej do dynamicznego wygenerowania formularza edycji dla tego typu rekordu.
set_field_value(self, field_name, attr_name, value) → FieldNadpisuje atrybuty pola modelu nadrzędnego w czasie działania:
field = self.set_field_value("item", "blank", False)
field.verbose_name = _("New description")
save_from_request(self, request, view_type, param)Wywoływana zamiast model.save() przy wysłaniu formularza. Daje dostęp do obiektu request dla logiki zapisu zależnej od kontekstu.
get_derived_object(self, param) → ModelZastępuje bieżący obiekt instancją pochodną (podklasą). Umożliwia zachowanie polimorficzne, gdzie wiersz tabeli bazowej może reprezentować różne wyspecjalizowane typy.
table_action(cls, list_view, request, data)Obsługuje niestandardowe akcje wyzwolone z widoku tabeli — zaznacz wiersze i wykonaj operacje wsadowe.
row_action(model, request, args, kwargs)Obsługuje akcje na pojedynczych wierszach.
filter(cls, value) → QuerySetNiestandardowe filtrowanie dla dynamicznych relacji (używane z row_related_list).
filter_by_permissions(queryset_or_obj, request) → QuerySetBezpieczeństwo na poziomie wiersza — ogranicza, które rekordy użytkownik może zobaczyć.
sort(queryset, sort_field, order) → QuerySetNiestandardowa logika sortowania wykraczająca poza proste porządkowanie pól.
redirect_href(self, view, request) → str | NonePrzekierowuje do innego URL po wyświetleniu tego rekordu. Przydatne dla nawigacji polimorficznej.
get_form_class(self, view, request, create) → Klasa formularzaGeneruje dynamicznie niestandardową klasę Django Form w zależności od stanu rekordu.
is_form_valid(form) → boolStatyczna metoda dla niestandardowej logiki walidacji formularza.
post_form(self, view, form, request) → boolHak wywoływany po walidacji formularza, a przed zapisem. Zwróć False, by zapobiec zapisowi.
template_for_object(self, view, context, doc_type) → str | NoneDostosowuje, który szablon renderuje ten konkretny rekord.
template_for_list(view, model, context, doc_type) → str | NoneDostosowuje, który szablon renderuje widok listy dla tego modelu.
Pytigon obsługuje relacje między tabelami wykraczające poza standardowe klucze obce Django:
filter + init_newZdefiniuj metodę klasową filter oraz metodę instancyjną init_new na tabeli powiązanej, by stworzyć dynamiczne, nie-SQL-owe relacje:
@classmethod
def filter(cls, value):
app, tbl, parent_id, grp = value.split('__')
return cls.objects.filter(
application=app, table=tbl, parent_id=parent_id, group=grp
)
def init_new(self, request, view, value=None):
return {'application': app, 'table': tbl, 'parent_id': parent_id, 'group': grp}
Są one łączone w szablonach przez:
Modele Pytigona automatycznie otrzymują:
created, modified) przez klasę bazową