Narzędzia użytkownika

Narzędzia witryny


pl:python:optionsfields

Opcje pól w modelach

null

Opcja null w polach modeli Django jest używana do określenia, czy pole w bazie danych może przyjmować wartości NULL. Wartością tej opcji jest wartość logiczna (True lub False). Opcja ta ma wpływ na to, czy w kolumnie bazy danych dla danego pola może być zapisane NULL (brak wartości).

Oto kilka przypadków użycia opcji null:

Pole, które może być puste

class MyModel(models.Model):
    description = models.TextField(null=True)

W tym przypadku pole description może przyjmować wartości NULL w bazie danych. Oznacza to, że w przypadku braku wartości dla tego pola, baza danych zapisze NULL.

Pole, które nie może być puste

class AnotherModel(models.Model):
    age = models.IntegerField(null=False)

W tym przypadku pole age nie może przyjmować wartości NULL w bazie danych. Domyślnie, gdy null nie jest ustawione explicite na True, pola są tak skonfigurowane, aby nie przyjmować wartości NULL.

Opcja null jest szczególnie istotna, gdy definiujesz strukturę bazy danych. Jeśli null=True, oznacza to, że kolumna dla tego pola w bazie danych może przechowywać wartości NULL, co może być przydatne, gdy nie masz danych do wprowadzenia, ale chcesz zachować spójność struktury bazy danych.

Warto zauważyć, że null dotyczy warstwy bazy danych, podczas gdy blank dotyczy formularzy i widoków Django. Oznacza to, że ustawienie null=True informuje system Django, że pole może przyjmować wartości NULL w bazie danych, ale nie wpływa na to, czy pole może być puste w formularzach.

Przykład z użyciem null w połączeniu z blank:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField(blank=True, null=True)

W tym przypadku, null=True oznacza, że baza danych może przechowywać wartości NULL dla pola content, a `blank=True` oznacza, że pole to może być puste w formularzach Django.

blank

Opcja blank w polach modeli Django jest używana do określenia, czy pole może być pozostawione puste (niezainicjowane) w przypadku tworzenia lub aktualizowania obiektu modelu. Opcja ta jest dostępna w wielu różnych typach pól modelu, takich jak CharField, TextField, DateField, IntegerField, itp.

Wartości opcji blank to wartości logiczne (True lub False). Oto kilka przykładów użycia:

Dopuszczalne puste pole

class MyModel(models.Model):
    name = models.CharField(max_length=100, blank=True)

W tym przykładzie pole name może być pozostawione puste. Podczas tworzenia lub aktualizacji obiektu modelu, nie będzie wymagane podanie wartości dla tego pola.

Pole nie może być puste

class AnotherModel(models.Model):
    age = models.IntegerField(blank=False)

W tym przypadku pole age nie może być pozostawione puste. Podczas tworzenia lub aktualizacji obiektu modelu, konieczne będzie podanie wartości dla tego pola.

Opcja blank jest zazwyczaj używana w połączeniu z opcją null oraz default, a także może być istotna podczas definiowania formularzy w Django. Warto zauważyć, że blank dotyczy formularzy i widoków Django, podczas gdy null dotyczy bazy danych. Oznacza to, że ustawienie blank=True informuje system Django, że pole może być puste w formularzach, ale nie wpływa na to, czy baza danych dopuszcza wartości NULL dla tego pola.

Przykład z użyciem blank w połączeniu z null:

class Article(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField(blank=True, null=True)

W tym przypadku, blank=True oznacza, że pole content może być puste w formularzach, a null=True oznacza, że baza danych może przechowywać wartości NULL dla tego pola.

choices

Opcja choices w polach modeli Django jest używana do zdefiniowania zestawu predefiniowanych wartości, które mogą być używane jako możliwe wartości dla danego pola. Ta opcja jest szczególnie przydatna, gdy chcesz ograniczyć dopuszczalne wartości dla konkretnego pola do określonego zestawu. W połączeniu z CharField, IntegerField, lub innymi polami, choices pozwala określić, które wartości są dopuszczalne, a także dostarcza czytelnych etykiet dla tych wartości.

Przykłady użycia opcji choices:

Pole CharField z choices

class MyModel(models.Model):
    GENDER_CHOICES = [
        ('M', 'Male'),
        ('F', 'Female'),
        ('O', 'Other'),
    ]
 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

Pole IntegerField z choices

class MyModel(models.Model):
    STATUS_CHOICES = [
        (0, 'Inactive'),
        (1, 'Active'),
        (2, 'Pending'),
    ]
 
    status = models.IntegerField(choices=STATUS_CHOICES)

Pole BooleanField z choices

class MyModel(models.Model):
    AVAILABILITY_CHOICES = [
        (True, 'Available'),
        (False, 'Not Available'),
    ]
 
    is_available = models.BooleanField(choices=AVAILABILITY_CHOICES)

W powyższych przykładach choices składa się z listy krotek, gdzie każda krotka zawiera dwie wartości: pierwsza to wartość, która będzie przechowywana w bazie danych, a druga to czytelna etykieta, która będzie wyświetlana w interfejsie użytkownika.

Korzyści z użycia choices:

- Ograniczenie dopuszczalnych wartości: Pozwala na zdefiniowanie ograniczonego zestawu możliwych wartości, co pomaga uniknąć błędów danych i utrzymać spójność danych w bazie danych.

- Poprawia czytelność kodu: Etykiety dostarczają czytelnych opisów wartości, co ułatwia zrozumienie przeznaczenia danych pola.

- Ułatwia współpracę z formularzami: W przypadku korzystania z formularzy Django, choices pomaga w automatycznym generowaniu pól wyboru (select fields) z odpowiednimi etykietami.

- Wspomaga zrozumienie modelu: Pomaga w zrozumieniu i dokumentowaniu modelu, szczególnie w przypadku pól, które przyjmują określone i znane zestawy wartości.

Ogólnie rzecz biorąc, choices jest używane w celu zdefiniowania i narzucenia ograniczeń na dopuszczalne wartości dla pól modelu w Django.

Termin „Enumeration types” w kontekście Django może odnosić się do korzystania z specjalnego pola modelu EnumField, wprowadzonego oficjalnie w Django 3.2 i nowszych. Wcześniej, przed pojawieniem się EnumField, często stosowano pole CharField lub IntegerField z opcją choices do symulowania enumeracji.

Różnice między stosowaniem choices a EnumField obejmują:

choices z CharField lub IntegerField

1. Typ danych:

  • W przypadku choices z CharField lub IntegerField, wartości są przechowywane w bazie danych jako znaki lub liczby całkowite.

2. Predefiniowane wartości:

  • choices opiera się na predefiniowanych zestawach wartości w postaci krotek.

3. Elastyczność:

  • Jest elastyczny i pozwala na używanie różnych typów pól (np. `CharField`, `IntegerField`) w zależności od potrzeb.

4. Zakres wartości:

  • Możesz używać różnych zakresów wartości w zależności od używanego pola.

5. Dostępność przed Django 3.2:

  • Jest dostępny w wersjach Django przed 3.2.

Przykład z choices i CharField:

class MyModel(models.Model):
    GENDER_CHOICES = [
        ('M', 'Male'),
        ('F', 'Female'),
        ('O', 'Other'),
    ]
 
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

EnumField

1. Typ danych:

  • Wartości są przechowywane jako specjalny typ enumeracyjny (typ wyliczeniowy), co może ułatwić operacje na danych.

2. Definiowanie Enumeracji:

  • Wymaga zdefiniowania specjalnej klasy Enum wewnątrz modelu, co pozwala na bardziej strukturalne definiowanie enumeracji.

3. Predefiniowane wartości:

  • Wartości są predefiniowane wewnątrz klasy Enum.

4. Zakres wartości:

  • Wszystkie możliwe wartości są zdefiniowane w jednym miejscu, co może pomóc w utrzymaniu spójności.

5. Dostępność od Django 3.2:

  • EnumField został oficjalnie wprowadzony w Django 3.2, co oznacza, że nie jest dostępny w wcześniejszych wersjach.


Przykład z EnumField:

from django.db import models
 
class MyModel(models.Model):
    class Gender(models.TextChoices):
        MALE = 'M', 'Male'
        FEMALE = 'F', 'Female'
        OTHER = 'O', 'Other'
 
    gender = models.EnumField(Gender, max_length=1)

Ogólnie rzecz biorąc, stosowanie EnumField może być bardziej korzystne, gdy chcesz używać dedykowanego typu enumeracyjnego w bazie danych, a także zapewnić bardziej strukturalne i zorganizowane zarządzanie enumeracjami w modelu. Jednak korzystanie z choices z CharField lub IntegerField może być wystarczająco elastyczne i prostsze, jeśli nie wymagasz zaawansowanej obsługi enumeracji.

Enumeration types

Typy enumeracyjne (Enumeration types) w Django, zwłaszcza poprzez EnumField wprowadzone w Django 3.2 i nowszych, są często stosowane w modelach w przypadkach, gdy pole powinno przyjmować jedną z predefiniowanych, ograniczonych wartości. Poniżej przedstawiam kilka przykładów, gdzie typy enumeracyjne są często używane:

Kategorie, Statusy, Stany

Enumeracje są przydatne do reprezentowania kategorii, statusów, stanów lub innych ograniczonych zestawów wartości. Na przykład, gdy masz model reprezentujący zamówienie, pole status może być definiowane jako enum, aby ograniczyć możliwe stany zamówienia.

from django.db import models
 
class Order(models.Model):
    class Status(models.TextChoices):
        PENDING = 'P', 'Pending'
        PROCESSING = 'PR', 'Processing'
        COMPLETED = 'C', 'Completed'
 
    status = models.CharField(max_length=2, choices=Status.choices)

Typy Kolorów

W modelach reprezentujących produkty, pojazdy itp., enumy mogą być używane do reprezentowania predefiniowanych typów kolorów.

from django.db import models
 
class Product(models.Model):
    class Color(models.TextChoices):
        RED = 'R', 'Red'
        GREEN = 'G', 'Green'
        BLUE = 'B', 'Blue'
    color = models.CharField(max_length=1, choices=Color.choices)

Płeć

Enumeracje mogą być używane do reprezentowania pól, takich jak płeć, gdzie możliwe wartości są ograniczone.

from django.db import models
 
class Person(models.Model):
    class Gender(models.TextChoices):
        MALE = 'M', 'Male'
        FEMALE = 'F', 'Female'
        OTHER = 'O', 'Other'
 
    gender = models.CharField(max_length=1, choices=Gender.choices)

Priorytety

W przypadku modeli z zadaniami, enumy mogą reprezentować priorytety.

from django.db import models
 
class Task(models.Model):
    class Priority(models.TextChoices):
        LOW = 'L', 'Low'
        MEDIUM = 'M', 'Medium'
        HIGH = 'H', 'High'
 
    priority = models.CharField(max_length=1, choices=Priority.choices)

Typy Dokumentów

numy mogą być używane do reprezentowania różnych typów dokumentów, na przykład w modelu reprezentującym przesyłki.

from django.db import models
 
class Shipment(models.Model):
    class DocumentType(models.TextChoices):
        INVOICE = 'I', 'Invoice'
        PACKING_SLIP = 'PS', 'Packing Slip'
        SHIPPING_LABEL = 'SL', 'Shipping Label'
 
    document_type = models.CharField(max_length=2, choices=DocumentType.choices)

Wprowadzenie typów enumeracyjnych pomaga w utrzymaniu spójności danych i ułatwia zrozumienie i zarządzanie możliwymi wartościami dla konkretnych pól. Ogranicza także ryzyko pojawienia się błędów związanych z wprowadzaniem niepoprawnych wartości do pól, ponieważ możliwe wartości są z góry określone.

db_column

Opcja db_column w polach modeli Django służy do określenia nazwy kolumny w bazie danych, do której dane pole powinno zostać odwzorowane. Domyślnie, Django automatycznie tworzy nazwy kolumn na podstawie nazw pól w modelu, ale opcja db_column umożliwia dostosowanie nazw kolumn w bazie danych, co może być przydatne w przypadku, gdy nazwy pól w modelu nie są zgodne z preferencjami nazewniczymi bazy danych.

Przykład użycia db_column:

from django.db import models
 
class MyModel(models.Model):
    first_name = models.CharField(max_length=50, db_column='custom_first_name')
    last_name = models.CharField(max_length=50, db_column='custom_last_name')
    age = models.IntegerField()

W tym przykładzie, pola first_name i last_name zostały opatrzone opcją db_column, aby określić niestandardowe nazwy kolumn w bazie danych ('custom_first_name' i 'custom_last_name').

Użycie db_column może być przydatne, gdy masz do czynienia z istniejącą bazą danych, która używa określonych nazw kolumn, i chcesz dostosować model Django do tej struktury. Ponadto, może to być również przydatne, jeśli stosujesz pewne konwencje nazewnicze w bazie danych, które różnią się od konwencji nazewniczych Django.

Warto jednak używać tej opcji z umiarem i tylko wtedy, gdy jest to naprawdę konieczne, ponieważ automatyczne tworzenie nazw kolumn na podstawie nazw pól w modelu jest jednym z mechanizmów ułatwiających pracę z Django.

db_comment

Opcja db_comment w polach modeli Django służy do dodawania komentarza do kolumny w bazie danych. Komentarze w bazie danych są opisami, które mogą zawierać dodatkowe informacje o celu, formatowaniu lub innym kontekście związanym z danym polem. Te komentarze są często używane do dokumentowania struktury bazy danych i mogą być przydatne dla administratorów bazy danych i innych osób pracujących z bazą danych.

Przykład użycia db_comment:

from django.db import models
 
class MyModel(models.Model):
    name = models.CharField(max_length=100, db_comment="The name of the item")
    description = models.TextField()
    date_created = models.DateTimeField(db_comment="The date and time when the item was created")

W tym przykładzie, pola name i date_created zostały opatrzone opcją db_comment, aby dodać komentarze do odpowiadających im kolumn w bazie danych.

Jest to szczególnie przydatne w przypadku współpracy z zespołem programistycznym, który pracuje nad projektem, a także dla osób administrujących bazę danych. Komentarze mogą dostarczyć dodatkowych informacji na temat znaczenia pól, co ułatwia zrozumienie struktury bazy danych.

Warto zauważyć, że dostępność tej opcji może zależeć od używanej bazy danych, ponieważ nie wszystkie systemy zarządzania bazą danych (DBMS) obsługują komentarze na poziomie kolumn. Na przykład, PostgreSQL obsługuje komentarze na poziomie kolumn, podczas gdy niektóre inne DBMS mogą nie mieć tej funkcji.

db_index

Opcja db_index w polach modeli Django służy do określania, czy dla danego pola powinien być automatycznie utworzony indeks w bazie danych. Indeksy są strukturami danych, które przyspieszają procesy wyszukiwania i sortowania w bazie danych, poprawiając wydajność zapytań.

Przykład użycia db_index:

from django.db import models
 
class MyModel(models.Model):
    name = models.CharField(max_length=100, db_index=True)
    description = models.TextField()
    date_created = models.DateTimeField(db_index=True)

W tym przykładzie, pola name i date_created zostały opatrzone opcją db_index=True, co oznacza, że dla tych pól zostaną automatycznie utworzone indeksy w bazie danych.

Warto używać indeksów dla pól, które są często używane w zapytaniach filtrujących, sortujących lub grupujących dane, ponieważ indeksy mogą znacznie przyspieszyć te operacje. Jednak zbyt duża liczba indeksów może wpłynąć na wydajność operacji zapisu (np. wstawianie, aktualizacja, usuwanie danych), dlatego warto zbalansować korzyści i koszty związane z indeksowaniem.

Django automatycznie tworzy indeksy dla kluczy głównych (primary_key) i pól, które są zdefiniowane jako klucze obce (ForeignKey). Opcja db_index daje większą kontrolę nad tym, które dodatkowe pola powinny być indeksowane.

Podsumowując, db_index jest używane do decydowania, czy dla danego pola powinien być automatycznie utworzony indeks w bazie danych w celu poprawy wydajności operacji wyszukiwania i sortowania.

db_tablespace

Opcja db_tablespace w polach modeli Django pozwala określić, w którym przestrzeni tabelowej (tablespace) w bazie danych mają być przechowywane dane dla danego pola. Przestrzenie tabelowe są mechanizmem, który umożliwia organizację danych w różnych obszarach dyskowych bazy danych, co może być przydatne w kontekście optymalizacji przechowywania i dostępu do danych.

Przykład użycia db_tablespace:

from django.db import models
 
class MyModel(models.Model):
    name = models.CharField(max_length=100, db_tablespace='my_custom_tablespace')
    description = models.TextField()

W tym przykładzie pole name modelu MyModel zostało opatrzone opcją db_tablespace, aby wskazać, że dane dla tego pola powinny być przechowywane w przestrzeni tabelowej o nazwie 'my_custom_tablespace'.

W praktyce, dostępność i konfiguracja przestrzeni tabelowej może zależeć od konkretnego systemu zarządzania bazą danych (DBMS), który jest używany (np. PostgreSQL, MySQL, Oracle). Nie wszystkie systemy baz danych obsługują tę opcję, a nawet jeśli obsługują, konfiguracja może różnić się między nimi.

Przy wyborze i konfiguracji przestrzeni tabelowej, należy kierować się specyficznymi zaleceniami i dokumentacją dostarczoną przez dostawcę bazy danych, którą używasz. W większości przypadków, szczegóły dotyczące przestrzeni tabelowej są bardziej związane z administracją bazą danych niż z modelem Django, i zazwyczaj są konfigurowane na poziomie samej bazy danych.

default

Opcja default w polach modeli Django umożliwia określenie wartości domyślnej dla danego pola, która zostanie ustawiona, gdy nowy rekord zostanie utworzony, a wartość dla tego pola nie zostanie podana.

Przykład użycia default:

from django.db import models
 
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publication_year = models.IntegerField(default=2022)
    rating = models.FloatField(default=0.0)

W tym przykładzie, dla modelu Book, pola publication_year i rating zostały opatrzone opcją default. Oznacza to, że jeśli przy tworzeniu nowego rekordu nie zostanie podana wartość dla tych pól, zostanie użyta wartość domyślna.

Przykład użycia w kodzie:

# Utworzenie nowego rekordu
book = Book.objects.create(title='Example Book', author='John Doe')
 
# Wartości domyślne są automatycznie ustawione
print(book.publication_year)  # Wyświetli: 2022
print(book.rating)  # Wyświetli: 0.0

Opcja default jest szczególnie przydatna, gdy chcesz zapewnić sensowną wartość domyślną dla pewnych pól, ale jednocześnie chcesz dać użytkownikowi możliwość nadpisania tej wartości, jeśli to konieczne. Działa to zarówno w przypadku tworzenia nowych rekordów, jak i w przypadku aktualizacji rekordów, które nie mają wartości dla tego pola.

editable

Opcja editable w polach modeli Django określa, czy dane pole powinno być dostępne do edycji w interfejsie administracyjnym oraz w formularzach modelu. Domyślnie wszystkie pola są uznawane za edytowalne (editable=True), co oznacza, że można je edytować zarówno w interfejsie administracyjnym, jak i w formularzach.

Przykład użycia editable:

from django.db import models
 
class Product(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2, editable=False)

W tym przykładzie pole price zostało ustawione na editable=False, co oznacza, że nie będzie dostępne do edycji w interfejsie administracyjnym ani w formularzach. Można to zastosować do pól, które powinny być automatycznie generowane lub obliczane, takich jak cena, której nie chcesz, aby użytkownicy zmieniali ręcznie.

Gdy editable jest ustawione na False, pole nie jest renderowane jako formularz edycji w interfejsie administracyjnym i nie jest uwzględniane w formularzach modelu. Jednak pole to nadal będzie dostępne do odczytu i wykorzystywane w zapytaniach do bazy danych.

error_messages

Opcja error_messages w polach modeli Django umożliwia dostosowanie komunikatów błędów, które są generowane w przypadku problemów związanych z danym polem. Dzięki tej opcji możesz zdefiniować niestandardowe komunikaty błędów dla różnych sytuacji, takich jak nieprawidłowy format, zbyt krótka wartość, itp.

Przykład użycia error_messages:

from django.db import models
 
class Person(models.Model):
    username = models.CharField(
        max_length=50,
        error_messages={
            'unique': 'This username is already in use.',
            'max_length': 'Please enter a shorter username.',
            'blank': 'Username cannot be blank.',
        }
    )
    email = models.EmailField(
        error_messages={
            'unique': 'This email address is already registered.',
            'invalid': 'Please enter a valid email address.',
        }
    )
    age = models.IntegerField(
        error_messages={
            'invalid': 'Please enter a valid integer for age.',
        }
    )

W tym przykładzie, dla modelu Person, pola username, email, i age zostały opatrzone opcją error_messages. Dla każdego pola zdefiniowano niestandardowe komunikaty błędów dla różnych sytuacji. Na przykład, dla pola username zdefiniowano komunikaty dla przypadku, gdy wartość jest nieunikalna ('unique'), przekracza maksymalną długość ('max_length'), lub jest pusta ('blank').

Dzięki tej opcji możesz dostosować komunikaty błędów do potrzeb twojej aplikacji lub interfejsu użytkownika, co może poprawić czytelność i zrozumienie komunikatów błędów przez użytkowników.

help_text

Opcja help_text w polach modeli Django jest używana do dostarczania krótkiego opisu lub wskazówek dotyczących tego, jak należy wypełnić dane w polu. Jest to pomocne w interfejsie administracyjnym, formularzach oraz wszędzie tam, gdzie dane są wprowadzane lub edytowane. Opcja ta umożliwia deweloperom dostarczenie użytkownikom jasnych informacji na temat oczekiwanych wartości lub formatu dla danego pola.

Przykład użycia help_text:

from django.db import models
 
class Person(models.Model):
    first_name = models.CharField(max_length=50, help_text="Enter your first name.")
    last_name = models.CharField(max_length=50, help_text="Enter your last name.")
    age = models.IntegerField(help_text="Enter your age.")
 
    def __str__(self):
        return f"{self.first_name} {self.last_name}"

W tym przykładzie, dla modelu Person, pola first_name, last_name i age zostały opatrzone opcją help_text. Gdy te pola są używane w interfejsie administracyjnym Django lub w formularzach, użytkownikowi zostaną wyświetlone krótkie wskazówki, które pomogą mu zrozumieć, co powinien wprowadzić w dane pola.

Opcja help_text jest przydatna, ponieważ może poprawić przejrzystość interfejsu użytkownika, zwłaszcza gdy formularze są używane do wprowadzania danych. Dzięki temu użytkownicy mają jasne wskazówki dotyczące oczekiwanych wartości lub formatu, co może zminimalizować błędy wprowadzania danych.

primary_key

Opcja primary_key w polach modeli Django jest używana do określenia, które pole w modelu będzie pełnić rolę klucza głównego (primary key) dla tabeli w bazie danych. Klucz główny to unikalny identyfikator, który jednoznacznie identyfikuje każdy rekord w tabeli.

Przykład użycia primary_key:

from django.db import models
 
class Person(models.Model):
    person_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=50)
    age = models.IntegerField()
 
    def __str__(self):
        return self.name

W tym przykładzie person_id zostało określone jako klucz główny poprzez primary_key=True. Domyślnie Django automatycznie dodaje klucz główny o nazwie id (typu AutoField), ale możesz go nadpisać, jak pokazano w przykładzie.

Możesz również używać innych pól jako klucza głównego, na przykład:

class Book(models.Model):
    isbn = models.CharField(primary_key=True, max_length=13)
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

W tym przypadku isbn zostało określone jako klucz główny.

Klucz główny jest istotny w relacyjnych bazach danych, ponieważ umożliwia jednoznaczne identyfikowanie każdego rekordu. W Django, jeśli nie zdefiniujesz własnego klucza głównego, Django automatycznie dodaje pole id jako klucz główny dla każdego modelu. Jednak opcja primary_key daje kontrolę nad tym, które pole pełni rolę klucza głównego.

unique

Opcja unique w polach modeli Django jest używana do narzucenia warunku unikalności dla wartości tego pola w kontekście wszystkich rekordów w bazie danych. Oznacza to, że każda wartość w tym polu musi być unikalna w obrębie całej tabeli.

Przykład użycia unique:

from django.db import models
 
class Person(models.Model):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(unique=True)
    employee_id = models.CharField(max_length=20, unique=True)
 
    def __str__(self):
        return self.username

W powyższym przykładzie, dla modelu Person, trzy pola (username, email, employee_id) zostały skonfigurowane z opcją unique=True. Oznacza to, że każda wartość w tych polach musi być unikalna w ramach całej tabeli.

Przykład:

- Nie można utworzyć dwóch rekordów w tabeli Person z takim samym username.
- Nie można utworzyć dwóch rekordów w tabeli Person z takim samym email.
- Nie można utworzyć dwóch rekordów w tabeli Person z takim samym employee_id.

Ta opcja jest przydatna, gdy chcesz mieć pewność, że dane w określonym polu są unikalne w kontekście całej tabeli. Jest to często stosowane dla pól, które powinny zawierać unikalne identyfikatory, takie jak nazwa użytkownika, adres e-mail, numer identyfikacyjny pracownika, itp.

W jednym modelu możesz używać opcji unique dla kilku pól, ale nie możesz użyć tego samego unique dla różnych kombinacji pól. Każde unique musi mieć unikalną kombinację pól. Oto kilka przypadków:

Unikalność pojedynczego pola

Każde z poniższych pól będzie musiało mieć unikalne wartości w kontekście całej tabeli.

class Person(models.Model):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(unique=True)
    employee_id = models.CharField(max_length=20, unique=True)

Unikalność kombinacji pól za pomocą unique_together

Możesz użyć unique_together, aby narzucić warunek unikalności dla konkretnej kombinacji pól.

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    publication_year = models.IntegerField()
 
    class Meta:
        unique_together = ['title', 'author']

Unikalność różnych kombinacji pól

Każda z poniższych kombinacji musi być unikalna.

class Product(models.Model):
    serial_number = models.CharField(max_length=20, unique=True)
    manufacturing_date = models.DateField()
    batch_number = models.CharField(max_length=10)
 
    class Meta:
        unique_together = ['serial_number', 'manufacturing_date']

W skrócie, możesz użyć opcji unique dla wielu pól w jednym modelu, ale musisz upewnić się, że każda kombinacja pól jest jednoznacznie unikalna. W przypadku bardziej złożonych warunków unikalności, możesz również korzystać z unique_together.

unique_for_date

Pole unique_for_date w modelach Django jest używane do narzucenia warunku unikalności dla wartości pola w ramach jednego dnia kalendarzowego. Oznacza to, że w obrębie jednego dnia wartości tego pola muszą być unikalne w kontekście pozostałych rekordów w bazie danych.

Przykład użycia unique_for_date:

from django.db import models
 
class Event(models.Model):
    event_name = models.CharField(max_length=100)
    event_date = models.DateField()
    location = models.CharField(max_length=100)
    slug = models.SlugField(unique_for_date='event_date')
 
    def __str__(self):
        return self.event_name

W powyższym przykładzie, dla modelu Event, pole slug zostało skonfigurowane z opcją unique_for_date='event_date'. Oznacza to, że wartości pola slug muszą być unikalne w ramach jednego dnia kalendarzowego w kontekście wartości pola event_date.

Przykład:
- Jeśli istnieje wydarzenie o event_date='2023-01-15' z slug='example', to w tym samym dniu nie może istnieć inne wydarzenie z slug='example'.
- Jednak w dniu 2023-01-16 można już utworzyć inne wydarzenie z slug='example'.

Ta opcja jest przydatna, gdy chcesz upewnić się, że pewne pola są unikalne w ramach jednego dnia kalendarzowego, co może być istotne w przypadku modeli, które reprezentują wydarzenia, daty, czy inne informacje związane z kalendarzem.

unique_for_month

Opcja unique_for_month w polach modeli Django jest używana do narzucenia warunku unikalności dla wartości pola w ramach jednego miesiąca kalendarzowego. Oznacza to, że w obrębie jednego miesiąca wartości tego pola muszą być unikalne w kontekście pozostałych rekordów w bazie danych.

Przykład użycia unique_for_month:

from django.db import models
 
class Event(models.Model):
    event_name = models.CharField(max_length=100)
    event_date = models.DateField()
    location = models.CharField(max_length=100)
    slug = models.SlugField(unique_for_month='event_date')
 
    def __str__(self):
        return self.event_name

W powyższym przykładzie, dla modelu Event, pole slug zostało skonfigurowane z opcją unique_for_month='event_date'. Oznacza to, że wartości pola slug muszą być unikalne w ramach jednego miesiąca kalendarzowego w kontekście wartości pola event_date.

Przykład:
- Jeśli istnieje wydarzenie o event_date='2023-01-15' z slug='example', to w tym samym miesiącu nie może istnieć inne wydarzenie z slug='example'.
- Jednak w lutym 2023 roku można już utworzyć inne wydarzenie z slug='example'.

Ta opcja jest przydatna, gdy chcesz upewnić się, że pewne pola są unikalne w ramach jednego miesiąca kalendarzowego, co może być istotne w przypadku modeli, które reprezentują wydarzenia, daty, czy inne informacje związane z kalendarzem.

unique_for_year

Opcja unique_for_year w polach modeli Django jest używana do narzucenia warunku unikalności dla wartości pola w ramach jednego roku kalendarzowego. Oznacza to, że w obrębie jednego roku wartości tego pola muszą być unikalne w kontekście pozostałych rekordów w bazie danych.

Przykład użycia unique_for_year:

from django.db import models
 
class Event(models.Model):
    event_name = models.CharField(max_length=100)
    event_date = models.DateField()
    location = models.CharField(max_length=100)
    slug = models.SlugField(unique_for_year='event_date')
 
    def __str__(self):
        return self.event_name

W powyższym przykładzie, dla modelu Event, pole slug zostało skonfigurowane z opcją unique_for_year='event_date'. Oznacza to, że wartości pola slug muszą być unikalne w ramach jednego roku kalendarzowego w kontekście wartości pola event_date.

Przykład:
- Jeśli istnieje wydarzenie o event_date='2023-01-15' z slug='example', to w tym samym roku nie może istnieć inne wydarzenie z slug='example'.
- Jednak w roku kalendarzowym 2024 można już utworzyć inne wydarzenie z slug='example'.

Ta opcja jest przydatna, gdy chcesz upewnić się, że pewne pola są unikalne w ramach jednego roku kalendarzowego, co może być istotne w przypadku modeli, które reprezentują wydarzenia, daty, czy inne informacje związane z kalendarzem.

verbose_name

Opcja verbose_name w polach modeli Django służy do dostarczenia czytelnej, ludzkiej nazwy dla pola, która może być używana w interfejsie administracyjnym Django, formularzach, a także w innych sytuacjach, gdzie wymagane jest przedstawienie pola w bardziej zrozumiały sposób.

Przykład użycia verbose_name:

from django.db import models
 
class MyModel(models.Model):
    first_name = models.CharField(max_length=50, verbose_name='First Name')
    last_name = models.CharField(max_length=50, verbose_name='Last Name')
    email = models.EmailField(verbose_name='Email Address')
    date_of_birth = models.DateField(verbose_name='Date of Birth')

W powyższym przykładzie, dla modelu MyModel, każde pole zostało opatrzone opcją verbose_name. Dzięki temu, gdy korzystasz z interfejsu administracyjnego Django, te nazwy będą wyświetlane zamiast domyślnych nazw generowanych automatycznie na podstawie nazw pól.

Opcja verbose_name ma na celu uczynienie kodu bardziej czytelnym i ułatwienie zrozumienia struktury modelu zarówno dla deweloperów, jak i dla osób pracujących z interfejsem administracyjnym Django.

Opcja verbose_name nie działa tylko w panelu administracyjnym. Chociaż jest szeroko stosowana w interfejsie administracyjnym Django do tworzenia bardziej przyjaznych użytkownikowi etykiet dla pól modeli, jej wpływ sięga poza ten obszar.

Oto kilka miejsc, gdzie verbose_name może mieć wpływ:

Panel Administracyjny Django

W panelu administracyjnym, verbose_name jest używane jako etykieta dla pól modelu. Dzięki temu, zamiast korzystać z automatycznie generowanych etykiet na podstawie nazw pól, możesz dostarczyć bardziej czytelne i zrozumiałe nazwy.

Formularze Django

Przy tworzeniu formularzy Django na podstawie modeli, etykiety pól będą bazować na wartościach verbose_name. Ułatwia to tworzenie formularzy z zrozumiałymi etykietami.

API i Serializatory

Jeśli używasz Django REST Framework do tworzenia API, verbose_name może być również używane jako etykieta dla pól w ramach serializatorów. Pomaga to w tworzeniu czytelnych i zrozumiałych struktur danych w API.

Szablony Django

W szablonach Django, wartość verbose_name może być używana do dostarczania przyjaznych użytkownikowi etykiet dla pól, co przyczynia się do czytelności i zrozumienia strony internetowej.

Podsumowując, chociaż verbose_name jest szczególnie przydatne w kontekście interfejsu administracyjnego, wprowadza również korzyści w innych obszarach, gdzie używane są informacje na temat struktury modelu.

validators

Poniżej znajdziesz przykłady wbudowanych opcji i klas walidatorów w Django, które można używać w opcji validators:

Opcje dla pól liczbowych

MinValueValidator: Sprawdza, czy wartość pola jest większa niż lub równa określonemu minimalnemu limitowi.

from django.core.validators import MinValueValidator
 
class MyModel(models.Model):
   number_field = models.IntegerField(validators=[MinValueValidator(limit_value=0)])

MaxValueValidator: Sprawdza, czy wartość pola jest mniejsza niż lub równa określonemu maksymalnemu limitowi.

from django.core.validators import MaxValueValidator
 
class MyModel(models.Model):
    number_field = models.IntegerField(validators=[MaxValueValidator(limit_value=100)])

Opcje dla pól tekstowych

MinLengthValidator: Sprawdza, czy długość wartości pola jest większa niż lub równa określonemu minimalnemu limitowi.

from django.core.validators import MinLengthValidator
 
class MyModel(models.Model):
    text_field = models.CharField(validators=[MinLengthValidator(limit_value=5)])

MaxLengthValidator: Sprawdza, czy długość wartości pola jest mniejsza niż lub równa określonemu maksymalnemu limitowi.

from django.core.validators import MaxLengthValidator
 
class MyModel(models.Model):
    text_field = models.CharField(validators=[MaxLengthValidator(limit_value=100)])

RegexValidator: Pozwala na zdefiniowanie niestandardowego wyrażenia regularnego do walidacji pola.

from django.core.validators import RegexValidator
 
class MyModel(models.Model):
    custom_field = models.CharField(validators=[RegexValidator(regex=r'^[0-9]*$', message='Only digits are allowed.')])

Opcje dla pól plików

FileExtensionValidator: Sprawdza, czy nazwa pliku ma określone rozszerzenie.

from django.core.validators import FileExtensionValidator
 
class MyModel(models.Model):
    file = models.FileField(validators=[FileExtensionValidator(allowed_extensions=['pdf', 'doc'])])

Opcje dla pól URL

URLValidator: Sprawdza, czy wartość pola jest poprawnym adresem URL.

from django.core.validators import URLValidator
 
class MyModel(models.Model):
    website = models.URLField(validators=[URLValidator()])

Opcje dla pól e-mail

EmailValidator: Sprawdza, czy wartość pola jest poprawnym adresem e-mail.

from django.core.validators import EmailValidator
 
class MyModel(models.Model):
    email = models.EmailField(validators=[EmailValidator()])

Te przykłady pokazują różne opcje walidatorów dostępnych w Django. Możesz łączyć różne walidatory, dodając je do listy przekazywanej jako argument validators w definicji pola modelu.

Warto sprawdzić oficjalną dokumentację Django dotyczącą walidatorów w celu uzyskania pełnej listy dostępnych opcji i klas walidatorów oraz dodatkowych informacji na ich temat. Jeśli potrzebujesz bardziej zaawansowanych walidacji, możesz również tworzyć własne funkcje walidujące, takie jak validate_positive.

Ponadto:

DecimalValidator to klasa walidatora w Django, która sprawdza, czy wartość pola numerycznego, takiego jak DecimalField, spełnia określone warunki dotyczące liczby całkowitej, maksymalnej liczby cyfr, maksymalnej liczby cyfr po przecinku, minimalnej liczby cyfr po przecinku itp.

Poniżej znajdziesz przykład użycia DecimalValidator:

from django.core.validators import DecimalValidator
from django.db import models
 
class Product(models.Model):
    price = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        validators=[
            DecimalValidator(
                max_digits=10,
                decimal_places=2,
                message='Price must have at most 10 digits in total, with 2 digits after the decimal point.',
            ),
            DecimalValidator(
                max_digits=None,
                decimal_places=0,
                message='Price must be an integer.',
            ),
            DecimalValidator(
                max_digits=None,
                decimal_places=2,
                min_digits=1,
                message='Price must have at least 1 digit before the decimal point.',
            ),
        ]
    )

W tym przykładzie, dla modelu Product, pole price jest typu DecimalField z maksymalnie 10 cyfr, z których 2 mogą znajdować się po przecinku. Trzy różne instancje DecimalValidator zostały użyte jako walidatory dla tego pola, z różnymi warunkami:

  1. NumeracjaPierwszy walidator sprawdza, czy cena ma maksymalnie 10 cyfr, z których 2 mogą znajdować się po przecinku.
  2. Drugi walidator sprawdza, czy cena jest liczbą całkowitą (nie ma cyfr po przecinku).
  3. Trzeci walidator sprawdza, czy cena ma przynajmniej 1 cyfrę przed przecinkiem, z maksymalnie 2 cyframi po przecinku.
pl/python/optionsfields.txt · ostatnio zmienione: 2023/12/01 10:01 przez sindap

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki