Dzisiejszy wpis będzie dotyczył modeli w Django, czyli spraw związanych z definiowaniem struktur i relacji w naszej bazie danych.

Każdy nasz model w Django charakteryzuje się kilkoma cechami:

  • każdy model to normalna pythonowa klasa, która dziedziczy po django.db.models.Model
  • dane niezwiązane z modelem umieszczamy w wewnętrznej klasie Meta
  • każda własność modelu określana jest jako pole w bazie danych
  • wszystkie zapytania do bazy danych wykonujemy za pomocą wbudowanego ORM

Wszystkie modele znajdziemy pod takim adresem: zdefiniowana_aplikacja/models.py. Poniżej bardzo prosty przykład modelu:

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)

Prosta klasa, posiadająca dwa pola first_name oraz last_name, która odpowiada za pobieranie od nas danych personalnych np. klienta. By stworzyć ten model musimy wykonać polecenie: python manage.py makemigrations i potem python manage.py migrate.

Po wykonaniu migracji ukaże nam się coś takiego:

CREATE TABLE zdefiniowana_aplikacja_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

ORM automatycznie generuje nam pole ‘id’ (można obejść) oraz automatycznie stosuję nazewnictwo tabel wg. ‘zdefiniowana_aplikacja_model’ (co też można obejść). Ważne: Gdy stworzysz już kilka rekordów w bazie danych i nagle zdecydujesz się dodać kolejne pole np. wiek to podczas migracji czeka cię trochę klikania by uzupełnić te dane.

Pola w modelach

Jak zapewne zauważyłeś, przy definiowaniu naszych pól ‘first_name’, ‘last_name’ pojawiło się coś takiego jak models.CharField. Django ma zdefiniowaną listę różnych pól, które mogą przechowywać określone typy danych. Nazwy pól w dość intuicyjny sposób można połączyć ze strukturami w naszej db.  Poniżej przegląd pól:

  1. AutoField – jest to pole z liczbą (int), które automatycznie dodaje liczbę do nowego rekordu. Zazwyczaj to pole jest dodawane automatycznie, dlatego bez konkretnych powodów nie musimy się tym specjalnie zamartwiać.
  2. BooleanField – pole zawierające wartość True oraz False. W panelu admina zobaczysz to pole jako checkbox.
  3. BigAutoField – odpowiednik AutoField, tylko w zapisie 64bit. Zakres od 1 do 9223372036854775807.
  4. BigIntegerField – odpowiednik IntegerField. Pole na liczby całkowite z zakresu  -9223372036854775807 do 9223372036854775807.
  5. BinaryField – pole do przechowywania danych binarnych.
  6. CharField – chyba najpopularniejsze pole. Jest to pole tekstowe przeznaczone na niewielką ilość znaków. Pole wymaga wartości max_length.
  7. DateField – pole przechowujące datę.
  8. DateTimeField – pole przechowujące date oraz czas.
  9. DecimalField – pole przechowujące liczby w zapisie dziesiętnym.
  10. DurationField – pole przeznaczone do przechowywania okresów czasu.
  11. EmailField – pole CharField, przeznaczone do przechowywania adresów email. Pole sprawdza czy wpisywana wartość jest poprawna.
  12. FileField – pole do uploadu plików. Pole wymaga parametru upload_to, które określa pełną ścieżkę, do którego ładujemy plik. Możemy to ustawić na sztywno, ale wygodniejszym sposobem jest ustawienie parametru MEDIA_ROOT w ustawieniach projektu.
  13. FilePathField – pole z ograniczonym wyborem do nazwy plików z danego katalogu.
  14. Lista wszystkim pól jakie możemy wykorzystać w DJANGO

Dodatkowe argumenty w polach

Do każdego pola możemy wpisać kilka dodatkowych argumentów takich jak:

  1. null – argument odpowiada za przypisanie wartości NULL w bazie danych. Domyślnie ustawione jako False
  2. blank – argument odpowiada za przyzwolenie by pozostawić puste pole w bazie danych.
  3. default – odpowiada za ustawienie domyślnej wartości pola.
  4. help_text – tekst pomocniczy.
  5. primary_key – jeżeli True to Django przypisze do danego pola PRIMARY_KEY
  6. unique – jeżeli True to Django ustawi wartość danego pola UNIQUE, czyli każda wartość pola będzie musiała być unikalna
  7. choices – array lub tuple zawierające kilka wariantów wyboru.
GENDER = (
    ('F', 'Female'),
    ('M', 'Male'),
)

Relacje

Many to One

Aby zdefiniować relację wiele do jednego, użyj django.db.models.ForeignKey. Używasz go tak, jak każdego innego typu Field: włączając go jako atrybut klasy twojego modelu.

class Book(models.Model):
    title = models.CharField(max_length=150)

class Author(models.Model):
    artist = models.ForeignKey(Book)
    name = models.CharField(max_length=50)

One to One

Podobna relacja do Many to One, tylko że jednemu rekordowi z tabeli A odpowiada jeden rekord z tabeli B. Tyle.

class Person(models.Model):
	user = models.OneToOneField(User, primary_key=True)
	first_name = models.CharField(max_length=30)

Many to Many

Wiele rekordów z tabeli A odpowiada wielu rekordom z tabeli B. Np. Książka mogłaby mieć wielu autorów.