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渲染頁面
Tags: