Продовжуючи нашу пригоду у світі Django ORM, ми підходимо до однієї з ключових тем — типів полів моделей. Якщо модель — це ваша конструкція, то поля моделі — це її цеглинки. Саме завдяки полям можна зберігати всю ту магію (дані), яку ви збираєтесь використовувати у вашому застосунку. Сьогодні ми розберемо, які типи полів доступні в Django і як правильно їх використовувати. Налаштування полів — це як проєктування бази даних, але з додатковим шаром комфорту та гнучкості, який надає Django.
Навіщо взагалі знати типи полів?
Уявіть, що ви проектуєте реальну базу даних для застосунку. У вас є інформація про користувачів (ім'я, вік, дата народження і т.д.). Django надає різні типи полів для зберігання цих даних. Хочете зберегти текст? Використовуйте CharField. Зберігаєте числа? Для цього є IntegerField. Дати? Будь ласка, ось вам DateField.
Знання того, які поля обирати для зберігання даних, важливе з двох причин:
- Оптимізація структури бази даних. Неправильний вибір типів даних може захаращувати таблиці або ускладнювати запити.
- Валідація даних. Django автоматично перевіряє дані, які записуються в базу, залежно від типу поля. Тож погані дані "не пролізуть".
Основні типи полів Django
Нижче представлений список найпопулярніших типів полів. Ми розглянемо їх функціонал та розберемо приклади використання.
1. CharField
Це текстове поле фіксованої довжини. Ви обов'язково маєте вказати атрибут max_length.
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=50) # Назва продукту, максимум 50 символів
Навіщо потрібен max_length? По-перше, щоб запобігти ситуаціям, коли користувачі вводять "війну і мир" у поле для імені. Крім того, бази даних, як правило, оптимізують довжину рядків, що пришвидшує роботу запитів.
2. TextField
Якщо CharField недостатньо для ваших потреб і потрібно зберігати багато тексту, то на сцену виходить масивний брат — TextField.
class BlogPost(models.Model):
content = models.TextField() # Текст посту блогу
Використовуйте TextField, коли потрібно зберігати великі обсяги тексту, наприклад, статті, коментарі користувачів та їх "описи життя".
3. IntegerField
Для зберігання цілих чисел використовуйте IntegerField.
class Order(models.Model):
quantity = models.IntegerField() # Кількість одиниць товару в замовленні
Якщо ви захочете задати неціле число (наприклад, "1.5 кг моркви"), то використовуйте інший тип поля (підказка: DecimalField).
4. DecimalField
DecimalField підходить для зберігання чисел із фіксованою точністю, таких як ціни.
class Product(models.Model):
price = models.DecimalField(max_digits=10, decimal_places=2)
# Число з 10 цифр, з яких 2 - після коми
Параметри:
max_digits— кількість усіх цифр.decimal_places— скільки з цих цифр буде після коми.
Не використовуйте FloatField для фінансових даних. Це загрожує втратою точності через особливості роботи з плаваючою точкою.
5. BooleanField
Це поле приймає тільки два значення: True або False.
class Product(models.Model):
is_available = models.BooleanField(default=True) # У наявності?
Бонус: атрибут default дозволяє задати значення за замовчуванням (у цьому випадку — товар доступний).
6. DateField і DateTimeField
Ці поля використовуються для зберігання дат і часу.
class Event(models.Model):
date = models.DateField() # Тільки дата
start_time = models.DateTimeField() # Повна дата і час
Використовуйте DateField, якщо вам потрібен тільки день, місяць і рік. Якщо потрібно враховувати ще й час — надавайте перевагу DateTimeField.
7. EmailField
Це спеціалізоване текстове поле, яке валідирує введення на відповідність формату email.
class User(models.Model):
email = models.EmailField(unique=True) # Унікальний email користувача
Яка користь? Django перевіряє, що ви не введете "щось_дивне@замість.email".
8. URLField
Для зберігання посилань використовуйте URLField. Воно автоматично перевіряє, що введений рядок є коректним URL.
class Bookmark(models.Model):
url = models.URLField()
Якщо хтось спробує ввести "незрозуміле.що", валідатор його сміливо заверне.
9. ImageField і FileField
Ці поля дозволяють зберігати зображення і файли.
class Profile(models.Model):
avatar = models.ImageField(upload_to='avatars/') # Зберігання аватарів користувачів
resume = models.FileField(upload_to='resumes/') # Зберігання резюме
Атрибут upload_to визначає папку для зберігання файлів. Ця магія працює у зв'язці з settings.MEDIA_ROOT.
10. ForeignKey (Міжмодельний зв'язок)
Ми детально розберемо зв'язки між моделями в окремому дні, але для розуміння: ForeignKey створює зв'язок "багато до одного".
class Category(models.Model):
name = models.CharField(max_length=100)
class Product(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
Один продукт належить до однієї категорії, але категорія може включати багато продуктів.
Атрибути Полів (Ще Трохи Магії)
Давайте звернемо увагу на те, які атрибути можна "прикрутити" до полів:
null=True: це дозволить полю бути порожнім у базі даних.blank=True: визначає, чи повинно поле бути обов’язковим при заповненні форми (на рівні валідації).default: встановлює значення за замовчуванням.unique=True: гарантує унікальність значення в таблиці бази.choices: використовується для обмеження значень поля. Працює як випадаючий список.
Приклад:
class Product(models.Model):
CATEGORY_CHOICES = [
('E', 'Electronics'),
('F', 'Furniture'),
]
category = models.CharField(
max_length=1,
choices=CATEGORY_CHOICES,
default='E',
)
Висновки (Без ВИСНОВКІВ)
Типи полів — це основа будь-якої моделі. Їх грамотне використання забезпечує стабільність, зручність і безпеку вашого застосунку. Практикуйтеся з різними типами полів, експериментуйте з атрибутами і пам'ятайте: модель — це ваш план архітектора, а дані — це те, що оживляє ваш застосунок.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ