Đã đăng vào thg 2 26, 2018 3:38 SA 7 phút đọc 7 phút đọc
Giới thiệu DjangoDjango là 1 web framework khá nổi tiếng được viết hoàn toàn bằng ngôn ngữ Python. Nó là 1 framework với đầu đủ các thư viện, module hỗ trợ các web-developer. Django sử dụng mô hình MVC và được phát triển bởi Django Software Foundation (DSF một tổ chức phi lợi nhuận độc lập) Mục tiêu chính của Django là đơn giản hóa việc tạo các website phức tạp có sử dụng cơ sở dữ liệu. Django tập trung vào tính năng “có thể tái sử dụng” và “có thể tự chạy” của các component, tính năng phát triển nhanh, không làm lại những gì đã làm. Một số website phổ biến được xây dựng từ Django là Pinterest, Instagram, Mozilla, và Bitbucket. Cài đặt Django- Các bạn có thể tham khảo ở https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04 Các bạn nên dùng virtualenv và pip để cài Django
Bắt đầu với DjangoProject- Tạo Project Django cung cấp 1 câu lệnh để render ra 1 template với cấu trúc hoàn chỉnh
django-admin startproject demo_django note: không đặt têt project là 'django' và 'test' và không đặt code trong /var/www Django sẽ trách đặt code ở các folder root. - Dùng sublime để mở project đã tạo và cùng xem cấu trúc: Chúng ta thấy folder ngoài
demo_django không liên quan gì tới code nên bạn có thể thay đổi tùy ý Chúng ta thấy folder ngoài demo_django không liên
quan gì tới code nên bạn có thể thay đổi tùy ý demo_django/__init__.py là 1 file rỗng chỉ định việc cái đường dẫn folder này sẽ được xem như là 1 Python package.demo_django/settings.py là file chứa các settings của project - DEBUG:
DEBUG = True bật/tăt chế độ debug - ALLOWED_HOSTS:
INSTALLED_APPS = [
.....
`book`,
]
0 nếu báo lỗi liên quan đến ALLOWED_HOSTS thì thêm địa chỉ vào list này. - INSTALLED_APPS: 1 project có thể có nhiều app, còn 1 app có thể thuộc nhiều project. Khi mình thêm 1 app mới thì cần cập nhật danh sách này. Đơn giản là nó chứa tất cả các app có thể dử dụng thanfhg instance của Django
django.contrib.admin – Site admin
django.contrib.auth – An authentication system. Hệ thống authentication
django.contrib.contenttypes – Hệ thống content types
django.contrib.sessions – Hệ thống session
django.contrib.messages – Hệ thống message
django.contrib.staticfiles – Hệ thống quản lý các file static
- DATABASES: đặt tả Database muốn dùng : SQLite(default), Postgres, Mysql,...
INSTALLED_APPS = [
.....
`book`,
]
1 là file khai báo các URL của project (kiểu như routing, với địa chỉ nào thì sẽ thực thi hàm nào)INSTALLED_APPS = [
.....
`book`,
]
2 là file dùng deploy project lên serverINSTALLED_APPS = [
.....
`book`,
]
3 là file để tạo app, migrate,...
- chạy server trên local
App- Tạo App
- Tạo Model Django hỗ trợ ORM (object relational mapping) nói 1 cách dễ hiểu, là 1 class hướng đối tượng sẽ được map thành 1 bảng trong database, 1 object / instance (thực thể của 1 class) sẽ được map thành 1 record (1 dòng) của bảng trong database. Trong Book application ra thiết kế đơn giản :
INSTALLED_APPS = [
.....
`book`,
]
6 có field INSTALLED_APPS = [
.....
`book`,
]
7,INSTALLED_APPS = [
.....
`book`,
]
8 có field INSTALLED_APPS = [
.....
`book`,
]
7, from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
0, from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
1, from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
2from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
Với việc khai báo như trên Django sẽ tạo 1 schema DB cho app và tạo API Python để truy cập Category và Book' Note: Bạn thấy hàm from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
3 được khai báo trong class nó tương tự như method toString trong Java với object. Ở đây bạn có thể override nó trong class ở Python giúp bạn hiển thị friendly name trong object. Mình sẽ nói cụ thể ở phần Shell Python ở dưới Nếu không 3, Làm quen với migrate - Tạo migration với câu lệnh
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
4Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
Bằng việc chạy makemigrations, Django sẽ hiểu là bạn đang tạo 1 sự thay đổi đến Model (trong trường này bạn đang create new) và sự thay đổi này sẽ được lưu như 1 migration. sau khi chạy xong sẽ tạo ra file book/migrations/0001_initial.py Nếu ra chỉnh sửa cấu trức của database thì lần makemigrations sẽ tạo ra file dạng 0002_......py - Kiểm tra câu lệnh mysql, quản lý db schema hoặc dễ hiểu hơn là phần prefix của file: 0001_initial.py
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
5BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
Ở đây có thể sẽ check format output , tên table, primary key,... xem đã chính xác chưa. - Nếu tất cả đã ok bạn có thể merge vào migrate để tạo table vào data base
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
6 Cơ chế hoạt động của migrate là sẽ lấy tất cả những migration chưa đc apply và chạy lại trong db đảm bảo dữ liệu trong db không bị xóa. - Kết luận :
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
7 : tạo migrations cho những thay đổi from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
8: check sql trước khi apply from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
9: apply vào những thay đổi vào db Note: Bạn có thể sử dụng 1 câu lệnh duy nhất Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
0
Shell PythonNhư rails có rails c thì để truy cập vào shell python chúng ta chạy lệnh command Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
1- Import những class mà mình mới khai báo
Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
2 - Hiển thị tất cả số record trong table
Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
3 - tạo record mới
Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
4 Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
5 Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
6 Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
7 - Như đã nói ở phần tạo model về hàm
from django.db import models
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Book(models.Model):
name = models.CharField(max_length=200)
price = models.IntegerField(default=0)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
author_name = models.CharField(max_length=200)
def __str__(self):
return self.name
3 Migrations for 'book':
0001_initial.py:
- Create model Category
- Create model Book
- Add field category to book
3 Khi sử dụng kết quả trả ra là : BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
0 Khi không sử dụng kết quả trả ra là: BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
1 - Filter
BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
2 BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
3 BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
4 - Thao tác với foreign key
BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
5 Note: Các bạn có thể tạo Book theo cách t2: BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
6- từ Book truy cập tới Category
BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
7 , BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
8 - từ Category truy cập tới Book
BEGIN;
CREATE TABLE "book_book" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL);
CREATE TABLE "book_category" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL);
CREATE TABLE "book_book__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(200) NOT NULL, "price" integer NOT NULL, "author_name" varchar(200) NOT NULL, "category_id" integer NOT NULL REFERENCES "book_category" ("id"));
INSERT INTO "book_book__new" ("category_id", "price", "id", "author_name", "name") SELECT NULL, "price", "id", "author_name", "name" FROM "book_book";
DROP TABLE "book_book";
ALTER TABLE "book_book__new" RENAME TO "book_book";
CREATE INDEX "book_book_2d5f8f90" ON "book_book" ("category_id");
COMMIT
9, django-admin startproject demo_django 0, django-admin startproject demo_django 1,....
- Xóa record
django-admin startproject demo_django 2
KếtMới tìm hiểu về Python nên mình cũng chỉ đưa ra được những kiến thức cơ bản nhất có trong https://docs.djangoproject.com/en/1.7/intro/tutorial01/ https://www.djangoproject.com/start/ https://www.digitalocean.com/community/tutorials/how-to-install-the-django-web-framework-on-ubuntu-14-04 All rights reserved |