+5

Models in Django (Part I)

Models

Model là nguồn thông tin chân thật và chính thức về dữ liệu của bạn. Nó chứa các trường (field) và các hành vi (behaviour) thiết yếu của dữ liệu mà bạn đang lưu trữ. Nói chung, mỗi model map với một bảng database.

Các điểm chính:

  • Mỗi model là một class Python kế thừa class django.db.models.Model
  • Mỗi attribute của model biểu diễn một trường dữ liệu (database field)
  • Django cung cấp API truy cập CSDL được sinh tự động (automatically-generated database-access API); xem Making queries

Quick example

Model mẫu này định nghĩa class Person, gồm hai trường first_namelast_name:

from django.db import models

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

Mỗi trường được xác định bởi một class attribute, và mỗi attribute map với một cột dữ liệu (database column).

Model Person bên trên sẽ tạo ra một bảng dữ liệu (database table) giống như:

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

Một số chú ý kỹ thuật:

  • Tên của bảng, myapp_person, sẽ được dẫn xuất từ một số model metadata nhưng có thể được override. Xem Table names để hiểu rõ hơn
  • Trường id sẽ được thêm tự động, nhưng bạn có thể override hành vi này. Xem Automatic primary key fields
  • Lệnh SQL CREATE TABLE trong ví dụ này được định dạng sử dụng cú pháp của PostgreSQL. Nhưng chú ý là Django kết nối với CSDL sử dụng cấu hình được thiết lập trong file setting

Using models

Một khi các model đã được định nghĩa, bạn cần phải nói cho Django biết bạn sẽ sử dụng các model đó. Thực hiện việc này bằng cách chỉnh sửa file setting. Cụ thể ở đây là thay đổi setting INSTALLED_APPS bằng cách thêm tên của module có chứa file models.py.

Ví dụ, nếu các model cho app của bạn nằm trong module myapp.models (cấu trúc package được tạo cho app bởi script manage.py startapp), INSTALLED_APPS sẽ giống như:

INSTALLED_APPS = [
    #...
    'myapp',
    #...
]

Khi thêm các app mới vào INSTALLED_APPS, hãy chắc chắn chạy manage.py migrate. Bạn cũng có thể tùy chọn tạo ra các migration cho chúng trước với manage.py makemigrations.


Fields

Phần quan trọng nhất của một model - và phần bắt buộc duy nhất của một model - là danh sách các trường dữ liệu mà nó định nghĩa. Các trường được xác định bởi các class attribute. Chú ý không chọn các tên conflict với models API như là clean, save hay delete.

Ví dụ:

from django.db import models


class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

Field types

Mỗi trường trong model nên là một instance của class Field. Django sử dụng các field class type để xác định một số điều:

  • Kiểu cột (column type) - kiểu dữ liệu mà database sẽ lưu (ví dụ INTEGER, VARCHAR, TEXT)
  • Widget HTML mặc định được sử dụng khi render một form field (ví dụ <input type="text">, <select>)
  • Các yêu cầu validate tối thiểu (minimal validation requirement) - được sử dụng trong Django's admin và trong các form được sinh tự động (automatically-generated form)

Django cung cấp hàng tá các field type được xây dựng sẵn; bạn có thể tìm thấy danh sách đầy đủ ở đây (model field reference). Bạn cũng có thể dễ dàng viết các field type cho riêng mình nếu như những thứ có sẵn của Django chưa làm bạn thỏa mãn. Xem Writing custom model fields.

Field options

Mỗi trường nhận một tập các tham biến (argument) đặc trưng cho trường (tham khảo ở đây model field reference). Ví dụ, CharField (và các class con của nó) yêu cầu tham biến max_length - xác định kích thước của trường dữ liệu VARCHAR được sử dụng để lưu dữ liệu.

Cũng có một tập các tham biến phổ biến sẵn có cho tất cả các field type. Tất cả là tùy chọn. Chúng được giải thích đầy đủ ở đây. Bên dưới là mô tả của một số tham biến được dùng nhiều nhất:

null

Nếu True, Django sẽ lưu các giá trị rỗng (empty) là NULL trong database. Mặc định là False.

blank

Nếu True, trường được phép trống (blank). Mặc định là False.

Chú ý rằng blank khác null. null liên quan thuần túy đến database trong khi blank lại liên quan đến việc validate. Nếu một trường có blank=True, quá trình validate form sẽ cho phép trường đó được trống. Nếu một trường có blank=False, trường đó là bắt buộc.

choices

Một iterable (ví dụ một list hoặc một tuple) gồm 2 tuple được sử dụng như là các lựa chọn cho trường này. Nếu tham biến này được truyền, widget mặc định của trường sẽ là một select box thay vì một text box và các lựa chọn của nó sẽ được giới hạn bởi các lựa chọn mà ta cung cấp.

Ví dụ:

YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)

Phần tử đầu tiên trong mỗi tuple là giá trị sẽ được lưu vào database. Phần tử thứ hai sẽ được hiển thị bởi widget mặc định hoặc trong một ModelChoiceField. Với một model instance, giá trị hiển thị cho mỗi trường lựa chọn (choices field) có thể được truy cập sử dụng get_FOO_display(). Ví dụ:

from django.db import models


class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

default

Giá trị mặc định cho trường. Có thể truyền một giá trị hoặc một callable object cho tham biến này.

help_text

Phần text có thể được dùng để hiển thị cùng với widget trên form.

primary_key

Nếu True, trường này sẽ là khóa chính của model.

Nếu bạn không muốn xác định primary_key cho bất cứ trường nào trong model của bạn, Django sẽ tự động thêm một trường IntegerField có nhiệm vụ làm khóa chính. Vì vậy bạn không cần phải set primary_key=True ở bất cứ trường nào trừ phi bạn muốn override hành vi mặc định của khóa chính (default primary-key behaviour). Để tìm hiểu thêm, xem Automatic primary key fields.

Trường primary key có tính read-only. Nếu bạn thay đổi giá trị của primary key của một đối tượng đang tồn tại và lưu lại, một đối tượng mới sẽ được tạo. Ví dụ:

from django.db import models


class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
['Apple', 'Pear']

unique

Nếu True, trường này sẽ là duy nhất.

Phần I của loạt bài dịch về Models trong Django xin được dừng lại ở đây 😃

Nguồn: https://docs.djangoproject.com/en/1.11/topics/db/models/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí