Django Flashcards
(28 cards)
Giải thích kiến trúc Django?
Django sử dụng kiến trúc MVT (Model - View - Template), tương tự MVC nhưng khác ở chỗ:
- Model: xử lý dữ liệu và logic nghiệp vụ.
- View: xử lý logic điều khiển và trả về dữ liệu cho Template.
- Template: hiển thị giao diện cho người dùng (kết hợp HTML với Django Template Language).
Trong Django, “View” đóng vai trò như “Controller” trong MVC. Nhà phát triển định nghĩa model, view, template và ánh xạ chúng với URL để phục vụ yêu cầu từ người dùng.
Giải thích cấu trúc thư mục Django?
- manage.py: Chạy lệnh quản lý dự án (runserver, migrate, v.v.).
- init.py: Đánh dấu thư mục là package Python.
- settings.py: Cấu hình dự án (database, secret key, v.v.).
- urls.py: Khai báo các đường dẫn (URL) của dự án/app.
- wsgi.py: Điểm vào của ứng dụng khi deploy với web server.
Chỉ cần nhớ:
- manage.py để chạy lệnh
- init.py để nhận diện package
- settings.py để cấu hình
- urls.py để định tuyến
- wsgi.py để triển khai
Model trong Django là gì?
- Model là một lớp đại diện cho một bảng trong cơ sở dữ liệu.
- Mỗi thuộc tính của model là một trường (cột) trong bảng.
- Định nghĩa model trong file app/models.py.
- Tất cả các model đều kế thừa từ django.db.models.Model.
- Có thể dùng class Meta bên trong để thiết lập thông tin bổ sung (ví dụ: tên bảng, quyền truy cập).
Ví dụ mẫu dễ nhớ:
from django.db import models class SampleModel(models.Model): field1 = models.CharField(max_length=50) field2 = models.IntegerField() class Meta: db_table = "sample_model"
Chốt ý:
- Model là lớp, thuộc tính là trường, kế thừa từ models.Model, định nghĩa trong models.py, có thể có Meta để tùy chỉnh.
Template trong Django hay DTL là gì?
- Template là phần giao diện trong kiến trúc MVT, gồm HTML, CSS.
- Nơi chứa biến và thông tin do view truyền vào.
- Template engine sẽ nhận diện và xử lý biến, tag trong template.
- Khi render, template thay biến bằng giá trị thực và xử lý tag, còn lại giữ nguyên.
- Cú pháp Django Template Language (DTL) gồm:
- Biến
- Tag
- Bộ lọc (filter)
- Comment
Chốt ý:
Template = HTML + CSS + biến/tag do view gửi, được render thành trang web hiển thị đúng dữ liệu.
-
Tag là các câu lệnh đặc biệt trong template dùng để thực hiện logic như:
- Điều kiện (if, else)
- Vòng lặp (for)
- Kế thừa template (extends)
- Định nghĩa khối nội dung (block)
- Chèn template khác (include)
- Và nhiều thao tác khác giúp template linh hoạt hơn
View trong Django là gì?
- View là hàm hoặc lớp Python nhận request từ client và trả về response (HTML, JSON, redirect, lỗi, v.v.).
- View quyết định dữ liệu nào sẽ gửi về trình duyệt.
Ví dụ đơn giản:
from django.http import HttpResponse def sample_function(request): return HttpResponse("Welcome to Django")
Có 2 loại view:
- Function-Based View (FBV): Viết view như một hàm.
- Class-Based View (CBV): Viết view theo hướng đối tượng (dùng class).
Câu chốt dễ nhớ:
View là hàm/lớp nhận request, trả response; có 2 loại: FBV (hàm), CBV (class).
Django ORM là gì?
- ORM (Object Relational Mapper) là công cụ giúp làm việc với cơ sở dữ liệu bằng code Python, không cần viết SQL trực tiếp.
- ORM tự động chuyển đổi giữa model (class Python) và bảng dữ liệu.
- Dùng ORM để truy vấn, thêm, sửa, xóa dữ liệu dễ dàng hơn.
Câu chốt dễ nhớ:
ORM là cầu nối giữa model và database, giúp thao tác dữ liệu bằng Python thay vì SQL.
Static file là gì?
Website cần phục vụ các files như hình ảnh, js và css. Trong Django, các file này gọi là “static file”. Nó được cung cấp bởi django.contrib.staticfiles
để quản lý các file đấy.
Django Rest Framework là gì?
Django Rest Framework (DJF) là một framework mã nguồn mở dựa trên Django để tạo RESTful API.
Django-admin và manage.py là gì?
- django-admin: Lệnh quản lý chung cho mọi dự án Django.
- manage.py: File tự động tạo khi tạo dự án, dùng để chạy lệnh quản lý trong đúng môi trường dự án.
Các lệnh thường gặp (dễ thuộc):
- startproject: Tạo dự án mới.
- startapp: Tạo app mới trong dự án.
- makemigrations: Tạo file migration khi đổi model.
- migrate: Áp dụng migration vào database.
- runserver: Chạy server trên localhost.
- createsuperuser: Tạo tài khoản admin.
Câu chốt dễ nhớ:
django-admin là lệnh tổng, manage.py là lệnh riêng cho từng dự án. Các lệnh quan trọng: startproject, startapp, makemigrations, migrate, runserver, createsuperuser.
Jinja là gì?
Jinja2 là một template engine cho Python, dùng để sinh ra HTML hoặc văn bản khác bằng cách chèn dữ liệu vào các vị trí được đánh dấu. Nó giống Django Template nhưng mạnh hơn, hỗ trợ control flow như if, for, và filter.
Django URL là gì?
- URL là địa chỉ để truy cập vào từng trang hoặc chức năng của web.
- Django dùng file urls.py để khai báo các URL và gắn chúng với hàm view tương ứng.
- Có thể tạo URL tĩnh (cố định) hoặc động (có tham số).
Cú pháp cơ bản:
from django.urls import path from . import views urlpatterns = [ path('duongdan/', views.ten_view), *# URL tĩnh* path('duongdan/<int:id>/', views.ten_view), *# URL động có tham số* ]
Câu chốt dễ nhớ:
URL trong Django được khai báo ở urls.py, dùng path để nối URL với view, có thể có tham số động.
Sự khác biệt giữa ứng dụng và dự án trong Django?
- Project (dự án): Là toàn bộ website, chứa nhiều app, quản lý cấu hình chung.
- App (ứng dụng): Là một phần chức năng nhỏ trong project, có thể tái sử dụng cho nhiều project khác nhau.
Ví dụ dễ nhớ:
Project giống như một cửa hàng lớn, app là từng quầy chức năng (bán hàng, thanh toán, quản lý khách…).
Câu chốt dễ nhớ:
Project là tổng thể, app là từng phần nhỏ; project chứa nhiều app, app chỉ xử lý một chức năng cụ thể.
Signals trong Django là gì?
- Signal là cơ chế giúp Django tự động thực hiện một hành động khi có sự kiện nào đó xảy ra (giống như “chuông báo”).
- Dùng để kết nối giữa các sự kiện (như lưu, xóa, khởi tạo model) với các hàm xử lý riêng.
Một số signal quan trọng dễ nhớ:
-
pre_init / post_init: Trước/sau khi khởi tạo model (
\_\_init\_\_
) -
pre_save / post_save: Trước/sau khi lưu model (
save
) -
pre_delete / post_delete: Trước/sau khi xóa model (
delete
) - m2m_changed: Khi trường ManyToMany thay đổi
- request_started / request_finished: Khi HTTP request bắt đầu/kết thúc
Câu chốt dễ nhớ:
Signal là “chuông báo” để tự động chạy hàm khi có sự kiện như khởi tạo, lưu, xóa model hoặc khi request bắt đầu/kết thúc.
Giải thích về caching trong Django?
- Caching là kỹ thuật lưu lại kết quả xử lý để dùng lại cho các lần sau nếu kết quả giống nhau, giúp tăng tốc độ truy cập và giảm tải cho hệ thống.
- Django hỗ trợ nhiều loại cache, mỗi loại phù hợp với từng nhu cầu khác nhau:
| Loại cache | Đặc điểm dễ nhớ |
Memcached | Cache trên RAM, rất nhanh và hiệu quả |
| FileSystem Caching | Lưu cache thành từng file riêng trên ổ đĩa |
| Local-memory Caching | Mặc định của Django, lưu cache ngay trong RAM của từng tiến trình, an toàn với thread |
| Database caching | Lưu cache trong database, hiệu quả nếu biết đánh chỉ mục |
Giải thích về xác thực người dùng trong Django?
Django có sẵn hệ thống xác thực người dùng, gồm 2 phần chính:
- Xác thực (Authentication): Kiểm tra đúng tài khoản/mật khẩu người dùng.
- Phân quyền (Authorization): Kiểm soát người dùng được phép làm gì.
Các thành phần chính:
- Users: Thông tin người dùng (tài khoản, mật khẩu, email…)
- Groups: Nhóm người dùng (dễ quản lý phân quyền theo nhóm)
- Permissions: Quyền hạn (ai được làm gì)
- Password Hashing: Lưu mật khẩu đã mã hóa, không lưu mật khẩu gốc
- Forms Validation: Kiểm tra dữ liệu đầu vào khi đăng nhập/đăng ký
- Backend System: Hỗ trợ thay đổi/cấu hình xác thực dễ dàng
Tóm tắt dễ nhớ:
- Django vừa xác thực (ai đăng nhập), vừa phân quyền (ai được làm gì).
- Có sẵn user, group, permission, mã hóa mật khẩu, kiểm tra form, backend linh hoạt.
Bạn chỉ cần nhớ:
“Django có hệ thống xác thực và phân quyền sẵn, gồm user, group, permission, bảo mật mật khẩu, kiểm tra form, dễ mở rộng.”
Giải thích về vòng đời Response trong Django?
- Trình duyệt gửi request đến web server (Nginx, Apache…).
- Web server chuyển request cho WSGI server (Gunicorn, uWSGI).
- Django nhận request, tạo đối tượng HttpRequest.
- Request đi qua các middleware (kiểm tra, xử lý chung).
- URL Router xác định view phù hợp dựa trên URL.
- View xử lý logic, truy vấn database, chuẩn bị dữ liệu.
- View trả về HttpResponse (có thể render template thành HTML).
- Response đi ngược lại qua các middleware (có thể thêm header, xử lý cache…).
- Django trả response cho WSGI server, sau đó WSGI server trả response cho web server.
- Web server gửi response về trình duyệt.
- Trình duyệt nhận response, hiển thị nội dung hoặc xử lý dữ liệu (HTML, JSON, file…).
Câu chốt dễ nhớ:
- Request đi từ trình duyệt → web server → WSGI → Django (middleware → router → view)
- View trả response → middleware → Django trả cho WSGI → web server → trình duyệt
- Trình duyệt nhận response, hiển thị hoặc xử lý tiếp.
Lưu ý bổ sung:
- Middleware có thể xử lý request và response theo thứ tự vào và ra.
- Response có thể là trang web, JSON, file tải về…
- Web server có thể phục vụ tệp tĩnh (CSS, JS) hoặc chuyển tiếp cho Django xử lý.
Session framework là gì?
🔁 Flow hoạt động:
1. User gửi request đến → chưa có session → server tạo session, lưu data, gửi lại cookie sessionid.
2. Các request sau → client gửi kèm sessionid → server tra lại session data → biết user nào, trạng thái gì.
3. Khi logout → xóa session → mất trạng th
Câu chốt dễ nhớ:
“Session trong Django lưu dữ liệu người dùng trên server, còn trình duyệt chỉ giữ cookie chứa mã nhận diện session. Nhờ vậy, dữ liệu được bảo mật và có thể nhớ trạng thái người dùng qua nhiều lần truy cập.”
Middleware trong Django là gì?
- Middleware là lớp trung gian nằm giữa request (yêu cầu từ trình duyệt) và response (phản hồi từ server).
- Khi một request đến, nó sẽ đi qua các middleware trước khi đến view xử lý.
- Sau khi view trả response, response cũng đi ngược lại qua các middleware trước khi về trình duyệt.
- Middleware có thể làm nhiều việc như: kiểm tra bảo mật, xử lý session, nén dữ liệu, ghi log, chỉnh sửa request/response…
- Django có sẵn nhiều middleware built-in, bạn cũng có thể tự tạo middleware riêng rất dễ dàng.
Đặc trưng của file settings.py?
- settings.py là file cấu hình trung tâm của dự án Django.
- File này lưu tất cả các thiết lập quan trọng cho ứng dụng, ví dụ:
- Kết nối cơ sở dữ liệu
- Danh sách các app cài đặt
- Cấu hình middleware
- Đường dẫn static, media, template
- Các key bảo mật (SECRET_KEY)
- Host được phép truy cập (ALLOWED_HOSTS)
- Cấu hình ngôn ngữ, múi giờ
- Các cấu hình liên quan đến email, logging, cache…
Câu trả lời mẫu dễ nhớ:
“settings.py là file lưu toàn bộ cấu hình của dự án Django, như database, app, middleware, static, template, bảo mật, host, và các thiết lập khác.”
Mixin là gì ?
- Mixin là một lớp nhỏ dùng để kết hợp các hành vi, thuộc tính vào nhiều lớp khác nhau bằng cách đa kế thừa.
- Nó giúp tái sử dụng code thông minh, tránh viết lại nhiều lần.
- Mixin không dùng để tạo đối tượng riêng mà chỉ để thêm chức năng cho lớp khác.
Ví dụ đơn giản:
class LoggerMixin: def log(self, msg): print(f"Log: {msg}") class JsonMixin: def to_json(self): import json return json.dumps(self.\_\_dict\_\_) class MyClass(LoggerMixin, JsonMixin): def \_\_init\_\_(self, name): self.name = name obj = MyClass("Test") obj.log("Hello") *# Dùng method từ LoggerMixin* print(obj.to_json()) *# Dùng method từ JsonMixin*
Tóm tắt dễ nhớ:
- Mixin = lớp nhỏ thêm hành vi cho lớp khác.
- Giúp tái sử dụng code nhanh, gọn.
- Dùng đa kế thừa để kết hợp nhiều mixin.
- Cần chú ý tránh trùng tên method gây nhầm lẫn.
Câu trả lời mẫu dễ nhớ:
“Mixin là lớp nhỏ dùng để thêm chức năng cho các lớp khác bằng đa kế thừa, giúp tái sử dụng code hiệu quả. Mixin không tạo đối tượng riêng mà chỉ bổ sung hành vi. Trong Python, mixin thường có hậu tố ‘Mixin’ để dễ nhận biết.”
Field trong Django là gì?
- Field là một cột trong bảng cơ sở dữ liệu, được định nghĩa trong model của Django.
- Nó giúp Django biết kiểu dữ liệu cần lưu (ví dụ: chuỗi, số, ngày tháng).
- Field chuyển đổi dữ liệu giữa Python và database, đảm bảo dữ liệu đúng kiểu khi lưu và lấy ra.
- Các Field phổ biến:
CharField
(chuỗi),IntegerField
(số nguyên),DateTimeField
(ngày giờ),ForeignKey
(khóa ngoại)… - Field là phần quan trọng để tạo model, form và truy vấn dữ liệu.
Ví dụ:
class Post(models.Model): title = models.CharField(max_length=100) *# cột title kiểu chuỗi* content = models.TextField() *# cột content kiểu văn bản dài* created = models.DateTimeField(auto_now_add=True) *# cột ngày tạo*
Câu trả lời mẫu dễ nhớ:
“Field trong Django là một cột trong bảng database, giúp định nghĩa kiểu dữ liệu và cách lưu dữ liệu. Field dùng để tạo model, form và truy vấn dữ liệu.”
Sự khác biệt giữa select_related và prefetch_related?
select_related
:
👉 Dùng cho ForeignKey hoặc OneToOne (nhiều bản ghi liên kết tới một bản ghi).
👉 Django sẽ JOIN các bảng lại, chỉ cần 1 truy vấn SQL lấy hết dữ liệu liên quan.
👉 Nhanh, tiết kiệm truy vấn khi lấy dữ liệu cha-con.
prefetch_related
:
👉 Dùng cho ManyToMany hoặc liên kết ngược (một bản ghi liên kết tới nhiều bản ghi).
👉 Django sẽ chạy nhiều truy vấn riêng biệt, sau đó kết hợp kết quả ở Python.
👉 Phù hợp khi lấy nhiều bản ghi liên quan (1-n hoặc n-n).
Câu ví dụ cực dễ nhớ
- select_related giống như:“Đi siêu thị 1 lần, mua hết mọi thứ cần trong 1 chuyến.”
- prefetch_related giống như:“Đi nhiều lần, mỗi lần mua một loại đồ, về nhà mới gom lại.”
Ví dụ code select_related
Giả sử có 2 model: Author
và Book
, mỗi cuốn sách có một tác giả (ForeignKey):
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE)
Lấy danh sách sách kèm tác giả dùng select_related
:
books = Book.objects.select_related('author').all() for book in books: print(book.title, book.author.name)
➡️ Django sẽ JOIN bảng Book
và Author
trong 1 truy vấn SQL duy nhất, lấy luôn thông tin tác giả.
Ví dụ code prefetch_related
Giả sử có 2 model: Author
và Book
, mỗi tác giả có nhiều sách (OneToMany):
class Author(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
Lấy danh sách tác giả kèm tất cả sách của họ dùng prefetch_related
:
authors = Author.objects.prefetch_related('books').all() for author in authors: print(author.name) for book in author.books.all(): print('-', book.title)
➡️ Django sẽ chạy 2 truy vấn riêng biệt:
- Lấy tất cả tác giả
- Lấy tất cả sách có tác giả trong danh sách trên
➡️ Sau đó Django sẽ kết hợp dữ liệu ở Python để bạn dễ truy cập.
Giải thích ví dụ N+1 truy vấn
Giả sử bạn có 10 cuốn sách (10 bản ghi trong bảng Book
), mỗi cuốn sách có một tác giả liên kết qua ForeignKey
.
books = Book.objects.all() # 1 truy vấn lấy tất cả sách for book in books: print(book.title, book.author.name) # Lấy tên tác giả cho từng sách
- Truy vấn đầu tiên (1 truy vấn):Lấy tất cả 10 cuốn sách từ database.
-
Truy vấn tiếp theo (10 truy vấn):Mỗi lần gọi
book.author.name
, Django sẽ chạy thêm 1 truy vấn để lấy tác giả.
➡️ Tổng cộng: 1 truy vấn lấy sách + 10 truy vấn lấy tác giả = 11 truy vấn
Tại sao nhiều truy vấn lại gây vấn đề?
- Nếu có 1000 cuốn sách → 1 + 1000 = 1001 truy vấn!
- Làm chậm ứng dụng, tốn tài nguyên, không hiệu quả.
Giải pháp:
- Dùng
select_related('author')
để Django JOIN và lấy hết trong 1 truy vấn duy nhất. - Hoặc dùng
prefetch_related
nếu quan hệ là 1-n hoặc n-n.
Sự khác biệt giữa OneToOneField và ForeignKey Field
- ForeignKey dùng cho quan hệ nhiều-một (many-to-one):Nhiều bản ghi ở bảng này liên kết tới một bản ghi ở bảng kia.Ví dụ: Nhiều bài viết (Post) thuộc về một tác giả (Author).
- OneToOneField dùng cho quan hệ một-một (one-to-one):Mỗi bản ghi ở bảng này chỉ liên kết với duy nhất một bản ghi ở bảng kia.Ví dụ: Mỗi người dùng (User) chỉ có một hồ sơ cá nhân (Profile).
Tóm tắt dễ nhớ:
- ForeignKey: Nhiều → Một
- OneToOneField: Một ↔ Một
Ví dụ:
*#ForeignKey: Nhiều bài viết thuộc về một tác giả* class Post(models.Model): author = models.ForeignKey(Author, on_delete=models.CASCADE) *# OneToOneField: Mỗi user chỉ có một profile* class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE)
Câu trả lời mẫu dễ nhớ:
“ForeignKey dùng cho quan hệ nhiều-một, còn OneToOneField dùng cho quan hệ một-một. ForeignKey cho phép nhiều bản ghi liên kết tới một bản ghi khác, còn OneToOneField chỉ cho phép mỗi bản ghi liên kết với một bản ghi duy nhất ở bảng kia.”
Bạn chỉ cần nhớ:
“ForeignKey: nhiều-một, OneToOneField: một-một.”
Bạn đang bị rối giữa select_related và prefetch_related đúng không? Dưới đây là cách giải thích lại cực kỳ đơn giản, dễ nhớ, không cần nhìn code cũng hiểu bản chất:
Giải thích đối tượng Q trong Django ORM?
- Q là một công cụ trong Django giúp bạn tạo các truy vấn phức tạp với nhiều điều kiện AND, OR, NOT.
- Nhờ Q, bạn có thể kết hợp nhiều điều kiện linh hoạt mà filter bình thường không làm được.
- Dùng Q khi cần hoặc (OR), và (AND), hoặc phủ định (NOT) trong truy vấn.