Django學習——圖書管理系統圖書修改、orm常用和非常用字段(了解)、 orm字段參數(了解)、字段關係(了解)、手動創建第三張表、Meta元信息、原生SQL、Django與ajax(入門)
1 圖書管理系統圖書修改
1.1 views
修改圖書獲取id的兩種方案
1 <input type="hidden" name="id" value="{{ book.nid }}">
2 <form action="/update_book/?id={{ book.nid }}" method="post">{% csrf_token %}
1.2 路由urls
1.3 前端模板
- book
- publish
- author
2 orm常用和非常用字段(了解)
1 常用
1 AutoField
int自增列,必須填入參數 primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列。
2 IntegerField
一個整數類型,範圍在 -2147483648 to 2147483647。
3 CharField
字符類型,必須提供max_length參數, max_length表示字符長度。
4 DateField
日期字段,日期格式 YYYY-MM-DD,相當於Python中的datetime.date()實例。
5 DateTimeField
日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當於Python中的datetime.datetime()實例
2 不常用:
FileField(Field)
- 字符串,路徑保存在數據庫,文件上傳到指定目錄
- 參數:
upload_to = "" 上傳文件的保存路徑
storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage
TextField(Field)
- 文本類型
BooleanField(Field)
- 布爾值類型
3 對應關係
對應關係:
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',
3 orm字段參數(了解)
1 #### null
用於表示某個字段可以為空。
2 #### **unique**
如果設置為unique=True 則該字段在此表中必須是唯一的 。
3 #### **db_index**
如果db_index=True 則代表着為此字段設置索引。
4 #### **default**
為該字段設置默認值。
5 ### DateField和DateTimeField
#### auto_now_add
配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫。
#### auto_now (對象.屬性 對象.save()) queryset.update 無效
配置上auto_now=True,每次更新數據記錄的時候會更新該字段。
6 choices
在model表模型定義的時候給某個字段指定choice
sex_choice=((1,'男'),(2,'女'),(0,'未知'))
sex=models.IntegerField(default=1,choices=sex_choice)
在使用的時候,直接取出中文
對象.get_sex_display()
null 數據庫中字段是否可以為空
db_column 數據庫中字段的列名
db_tablespace
default 數據庫中字段的默認值
primary_key 數據庫中字段是否為主鍵
db_index 數據庫中字段是否可以建立索引
unique 數據庫中字段是否可以建立唯一索引
unique_for_date 數據庫中字段【日期】部分是否可以建立唯一索引
unique_for_month 數據庫中字段【月】部分是否可以建立唯一索引
unique_for_year 數據庫中字段【年】部分是否可以建立唯一索引
了解:
verbose_name Admin中顯示的字段名稱
blank Admin中是否允許用戶輸入為空
editable Admin中是否可以編輯
help_text Admin中該字段的提示信息
choices Admin中顯示選擇框的內容,用不變動的數據放在內存中從而避免跨表操作
如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
error_messages 自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息;
字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
如:{'null': "不能為空.", 'invalid': '格式錯誤'}
validators 自定義錯誤驗證(列表類型),從而定製想要的驗證規則
from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '優先錯信息1',
'c2': '優先錯信息2',
'c3': '優先錯信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='錯誤了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'),
EmailValidator(message='又錯誤了', code='c3'), ]
)
4 字段關係(了解)
1 一對一 一對多 多對多
一對多
2 ForeignKey
外鍵類型在ORM中用來表示外鍵關聯關係,一般把ForeignKey字段設置在 『一對多』中』多』的一方。
ForeignKey可以和其他表做關聯關係同時也可以和自身做關聯關係。
-to
設置要關聯的表
-to_field
設置要關聯的表的字段
-related_name
反向操作時,使用的字段名,用於代替原反向查詢時的』表名_set』。
-related_query_name
反向查詢操作時,使用的連接前綴,用於替換表名。
on_delete
當刪除關聯表中的數據時,當前表與其關聯的行的行為。
models.CASCADE
刪除關聯數據,與之關聯也刪除
models.DO_NOTHING
刪除關聯數據,什麼都不做
models.PROTECT
刪除關聯數據,引發錯誤ProtectedError
models.SET_NULL
刪除關聯數據,與之關聯的值設置為null(前提FK字段需要設置為可空)
models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置為默認值(前提FK字段需要設置默認值)
models.SET
刪除關聯數據,
a. 與之關聯的值設置為指定值,設置:models.SET(值)
b. 與之關聯的值設置為可執行對象的返回值,設置:models.SET(可執行對象)
db_constraint
是否在數據庫中創建外鍵約束,默認為True。 False 不建立外鍵
-外鍵是否建立:
插入數據,會去檢索關聯,有個校驗
-好處:不會出現臟數據
-壞處:插入的時候,效率低
-企業中,通常不建立,程序員控制
3 一對一 OneToOneField 同ForeignKey一樣
4 多對多 ManyToManyField :如何手動創建第三張表
5 手動創建第三張表
-字段參數
-db_table:指定第三張表的名字 默認創建第三張表時,數據庫中表的名稱。
-to: 設置要關聯的表
-related_name: 同ForeignKey字段。
-related_query_name: 同ForeignKey字段。
-through: 手動創建第三張表來管理多對多關係,通過through來指定第三張表的表名。
-through_fields: 設置關聯的字段。
-多對多關係建立的三種方式
-第一種:自動創建(常用:第三張表沒有其他字段)
-第二種:手動創建第三張(比較常用:第三張表有多餘字段)
-第三種:完全手動寫第三張表
-第三種:
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="書名")
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
# 自己創建第三張表,分別通過外鍵關聯書和作者
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")
-第一種:
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="書名")
# 通過ORM自帶的ManyToManyField自動創建第三張表
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", related_name="authors")
-第二種:
class Book(models.Model):
title = models.CharField(max_length=32, verbose_name="書名")
# 自己創建第三張表,並通過ManyToManyField指定關聯
class Author(models.Model):
name = models.CharField(max_length=32, verbose_name="作者姓名")
books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
# through_fields接受一個2元組('field1','field2'):
# 其中field1是定義ManyToManyField的模型外鍵的名(author),field2是關聯目標模型(book)的外鍵名。
class Author2Book(models.Model):
author = models.ForeignKey(to="Author")
book = models.ForeignKey(to="Book")
class Meta:
unique_together = ("author", "book")
# through_fields 元組的第一個值是ManyToManyField所在的表去中間表通過哪個字段,就寫在第一個位置
# 基於對象的跨表查詢 還能繼續使用
# 基於雙下劃線連表查
# 原來的多對多操作api用不了,需要手動操作
6 Meta元信息
ORM對應的類裏面包含另一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段如下:
db_table
ORM在數據庫中的表名默認是 app_類名,可以通過db_table可以重寫表名。
index_together
聯合索引。
unique_together
聯合唯一索引。
ordering
指定默認按什麼字段排序。
只有設置了該屬性,我們查詢到的結果才可以被reverse()。
class UserInfo(models.Model):
nid = models.AutoField(primary_key=True)
username = models.CharField(max_length=32)
class Meta:
# 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
db_table = "table_name"
# 聯合索引
index_together = [
("pub_date", "deadline"),
]
# 聯合唯一索引
unique_together = (("driver", "restaurant"),)
ordering = ('name',)
# admin中顯示的表名稱
verbose_name='哈哈'
# verbose_name加s
verbose_name_plural=verbose_name
7 原生SQL
from django.db import connection, connections
cursor = connection.cursor() # connection=default數據
cursor = connections['db2'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone()
row = cursor.fetchall()
ret = models.Author.objects.raw('select * from app01_author where nid>1')
print(ret)
for i in ret:
print(i)
print(ret.query)
# 會把book的字段放到author對象中
ret = models.Author.objects.raw('select * from app01_book where nid>1')
print(ret)
for i in ret:
print(i.price)
print(type(i))
8 Django與ajax(入門)
1 概念
AJAX(Asynchronous Javascript And XML)翻譯成中文就是「異步Javascript和XML」。即使用Javascript語言與服務器進行異步交互,傳輸的數據為XML(當然,傳輸的數據不只是XML,現在更多使用json數據)。
2 異步:請求發出去,不會卡在這,可以干其他事
3 局部刷新:js的DOM操作,使頁面局部刷新
4 基本上web頁面都有很多ajax請求
8.1 寫ajax跟後端交互
1 使用原生js寫ajax請求(沒有人用)
-第一:麻煩
-第二:區分瀏覽器,需要做瀏覽器兼容
2 現在主流做法 (現成有人封裝好了,jquery,axios..)
-以jQuery為例講 前後端混合
-後面會講axios 前後端分離
回顧
1 圖書管理系統編輯功能
2 常用和非常用字段
3 字段參數
4 字段關係:to, to_fileds, related_name, related_query_name, on_delete, db_constraint
5 第三張表建立的三種方式
-純手動建立(不使用manytomany)
-自動創建第三張表
-手動創建第三張表,使用manytomany(多對多api用不了)
6 Meta元信息
7 原生sql
8 orm框架(了解)
-python:Django的orm,sqlalchemy(獨立使用,集成到flask)
-go:beego自帶的orm框架,gorm
-java:mybatis,Hibernate
9 ajax:js跟後端交互
-異步
-局部刷新
-原生js寫(麻煩,兼容瀏覽器)
-jQuery的ajax
-axios
發給請求 拿到數據 js渲染頁面