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ỗ:
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?
Chỉ cần nhớ:
Model trong Django là gì?
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 ý:
Template trong Django hay DTL là gì?
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.
View trong Django là gì?
Ví dụ đơn giản:
from django.http import HttpResponse
def sample_function(request):
return HttpResponse("Welcome to Django")Có 2 loại view:
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ì?
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ì?
Các lệnh thường gặp (dễ thuộc):
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ì?
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?
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ì?
Một số signal quan trọng dễ nhớ:
\_\_init\_\_)save)delete)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?
| 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:
Các thành phần chính:
Tóm tắt dễ nhớ:
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?
Câu chốt dễ nhớ:
Lưu ý bổ sung:
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ì?
Đặc trưng của file settings.py?
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ì ?
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ớ:
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ì?
CharField (chuỗi), IntegerField (số nguyên), DateTimeField (ngày giờ), ForeignKey (khóa ngoại)…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ớ
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:
➡️ 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
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 đề?
Giải pháp:
select_related('author') để Django JOIN và lấy hết trong 1 truy vấn duy nhất.prefetch_related nếu quan hệ là 1-n hoặc n-n.Sự khác biệt giữa OneToOneField và ForeignKey Field
Tóm tắt dễ nhớ:
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?