(91) 350-9520 support@omarine.org M-F: 7 AM - 7 PM; Weekends: 9 AM - 5 PM

Lập trình Web: Python: Django: Chương trình thăm dò ý kiến, phần 2

4. Cài đặt cơ sở dữ liệu

Chúng ta cài đặt cơ sở dữ liệu MySQL cho dự án. Bạn sử dụng tài khoản quản trị MySQL để tạo một cơ sở dữ liệu tên là django_mysite, rồi cấp quyền truy cập cho người sử dụng MySQL mà đăng kí trong dự án, giả sử là emin@localhost. emin cũng cần có quyền truy cập cơ sở dữ liệu test_django_mysite để chạy test, là cơ sở dữ liệu được tạo ra tự động khi test.

Các quyền truy cập cần có là SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER. Chúng ta đơn giản chọn ALL cho cả hai cơ sở dữ liệu.

Bạn soạn thảo tệp mysite/settings.py, thay bộ phận DATABASES với nội dung dưới đây, đổi giá trị của hai khóa 'USER''PASSWORD' cho phù hợp

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_mysite',
        'USER': 'emin',
        'PASSWORD': '********',
        'HOST': '127.0.0.1',
    }
}

Chương trình sẽ làm việc với các hàm thời gian, bạn đặt TIME_ZONE theo múi giờ của mình.

Cuối cùng, chúng ta cài đặt mysqlclient

pip install mysqlclient

5. Tạo mô hình

Mô hình qui định cách tổ chức cơ sở dữ liệu của chương trình. Bạn soạn thảo tệp polls/models.py với nội dung sau:

from django.db import models
from django.utils import timezone
import datetime

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

Chương trình Polls có hai mô hình được đại diện bởi hai lớp đối tượng: Question và Choice. Mỗi đối tượng của lớp Question ứng với một câu hỏi, mỗi câu hỏi có một số bình chọn tương ứng với các đối tượng của lớp Choice. Nội dung câu hỏi và bình chọn do chủ trang soạn thảo trong khu vực quản trị. Khách viếng thăm sẽ chọn mục bình chọn theo quyết định của họ

Cả hai lớp đều kế thừa lớp models.Model. Mỗi lớp có một số biến lớp, mỗi biến đại diện cho một trường cơ sở dữ liệu trong mô hình.

Mỗi trường được đại diện bởi một đối tượng của lớp Field. Lớp CharField dành cho trường kí tự và lớp DateTimeField dành cho thời gian. Tên của các đối tượng, ví dụ question_text và pub_date, là tên của các trường, trong dạng thân thiện với máy. Bạn sẽ sử dụng những tên này trong mã Python, trong khi cơ sở dữ liệu sẽ sử dụng chúng như tên cột.

Bạn có thể sử dụng đối số vị trí thứ nhất trong phương thức khởi tạo các lớp Field để thiết kế một cái tên dễ đọc. Trong chương trình, ‘date published’ là tên dành cho biến đối tượng pub_date.

Một số lớp Field yêu cầu đối số, như CharField yêu cầu bạn chỉ ra max_length. Điều đó là cần không chỉ cho lược đồ cơ sở dữ liệu, mà cả xác nhận đầu vào. Cũng có đối số tùy chọn, như biến đối tượng votes lấy giá trị mặc định default bằng 0.

ForeignKey xác định khóa ngoại trong quan hệ một – nhiều giữa bảng câu hỏi và bảng bình chọn. Như vậy, tên trường khóa ngoại là question. Django qui ước thêm vào ‘_id’, kết quả là question_id. Chúng ta có thể truy cập trực tiếp cơ sở dữ liệu MySQL để xem cấu trúc của bảng bình chọn

Lớp Question có phương thức was_published_recently() xác định một câu hỏi là xuất bản gần đây nếu nó ở trong quá khứ và không quá 1 ngày. Phương thức này được bổ sung các thuộc tính admin_order_field, boolean, short_description phục vụ cho giao diện quản trị. Các thuộc tính này sẽ được nhắc đến khi xem xét trang quản trị. Khi thêm thuộc tính cho một phương thức, khóa tương ứng được cập nhật cho từ điển __dict__ của nó.

Các phương thức __str__() dùng để trình bày đối tượng bằng văn bản. Phương thức __str__() là đặc tính Python, không phải Django. Trong Django nó còn được dùng trong các thao tác xử lý admin tự động.

6. Kích hoạt mô hình

Để kích hoạt mô hình của chương trình Polls chúng ta cần cấu hình dự án để nhận chương trình, bằng cách tham chiếu lớp cấu hình của nó trong INSTALLED_APPS của mysite. Lớp PollsConfig ở trong tệp polls/apps.py nên đường dẫn của nó là polls.apps.PollsConfig. Soạn thảo mysite/settings.py và thêm đường dẫn này vào INSTALLED_APPS. Toàn bộ nội dung mới của bộ phận INSTALLED_APPS như sau:

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Khi mô hình thay đổi (tính cả trường hợp tạo mới), thông tin thay đổi cần được lưu lại. Việc đó được thực hiện bằng lệnh makemigrations

python manage.py makemigrations polls

Những thay đổi đó được ghi vào tệp polls/migrations/0001_initial.py. Trong đó 0001 là tên của một migration (di chuyển dữ liệu). Lệnh sqlmigrate lấy các tên migration và trả về SQL

python manage.py sqlmigrate polls 0001

Bây giờ, chạy migrate để áp dụng thay đổi mô hình tới cơ sở dữ liệu

python manage.py migrate

7. Chơi API

Hãy vào Python để chơi API:

python manage.py shell

Chúng ta vào như thế thay cho gõ lệnh “python” thông thường vì manage.py đặt biến môi trường DJANGO_SETTINGS_MODULE đưa cho Django đường dẫn nhập khẩu Python tới tệp mysite/settings.py.

Ban đầu chưa có câu hỏi, sau đó đối tượng câu hỏi q được tạo với question_text là “What’s new?”. q.save() thực hiện giữ đối tượng vào cơ sở dữ liệu. Nó có id là 1.

q.question_text và q.pub_date trình bày các thuộc tính của đối tượng, rồi q.question_text đổi thành “What’s up?”.

q nhận đối tượng câu hỏi tra theo khóa chính pk=1, vẫn là đối tượng cũ. q.was_published_recently() cho biết câu hỏi có xuất bản gần đây không, kết quả là True.

q.choice_set.all() trả về tất cả các đối tượng bình chọn liên quan, chưa có mục bình chọn nào. Tiếp theo, 3 đối tượng bình chọn được tạo cho câu hỏi q, trong đó đối tượng cuối cùng được gán vào biến c. c dùng thuộc tính question truy cập đối tượng câu hỏi. Lúc này q.choice_set.all() đã trình bày 3 mục bình chọn của câu hỏi.

Choice.objects.filter(question__pub_date__year=current_year) tìm tất cả các mục bình chọn cho mọi câu hỏi trong năm. Cuối cùng, xóa mục bình chọn c của câu hỏi “What’s up?”.

Vào mysql, chúng ta sẽ thấy dữ liệu các bảng trong cơ sở dữ liệu django_mysite

Advertisements

Gửi phản hồi

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: