Django框架之Model系統:ORM基礎(一)

基本設置

1、什麼是ORM?

ORM:Object Relational Mapping(對象關係映射)python

映射關係:

  表名 --------------------》類名mysql

  字段--------------------》屬性git

  表記錄-----------------》類實例化對象sql

ORM的兩大功能:

  操做表:數據庫

    - 建立表django

    - 修改表app

    - 刪除表ide

  操做數據行:工具

    - 增刪改查spa

ORM利用pymysql第三方工具連接數據庫

Django沒辦法幫咱們建立數據庫,只能咱們建立完以後告訴它,讓django去連接

2、建立表以前的準備工做

1、本身建立數據庫

2、在settings裏面配置mysql數據庫連接

  sqlite3------改成mysql(若是使用的是mysql數據庫才進行此步驟)

# 修改django默認的數據庫的sqlite3爲mysql
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "你的數據庫名稱",  # 須要本身手動建立數據庫
        "USER": "數據庫用戶名",
        "PASSWORD": "數據庫密碼",
        "HOST": "數據庫IP",
        "POST": 3306
    }
}

  

  

  

3、app01中的--init--文件

導入pymysql模塊,在——init——文件中,告訴Django使用pymysql模塊鏈接MySQL數據庫:

import pymysql
pymysql.install_as_MySQLdb()

4、建立數據庫表

在models.py中建立對應的Book表

#models.py
class Book(models.Model):  #必需要繼承的
    nid = models.AutoField(primary_key=True)  #自增id(能夠不寫,默認會有自增id)
    title = models.CharField(max_length=32)
    publishDdata = models.DateField()  #出版日期
    author = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5,decimal_places=2)  #一共5位,保留兩位小數

  

 

 執行命令建立:(須要記住的!!!) 

python3 manage.py makemigrations   建立腳本
python3 manage.py migrate   遷移

在model中建立表所對應的字段:

 1  AutoField(Field)  2         - int自增列,必須填入參數 primary_key=True  3 
 4  BigAutoField(AutoField)  5         - bigint自增列,必須填入參數 primary_key=True  6 
 7  注:當model中若是沒有自增列,則自動會建立一個列名爲id的列  8         from django.db import models  9 
 10         class UserInfo(models.Model):  11             # 自動建立一個列名爲id的且爲自增的整數列
 12             username = models.CharField(max_length=32)  13 
 14         class Group(models.Model):  15             # 自定義自增列
 16             nid = models.AutoField(primary_key=True)  17             name = models.CharField(max_length=32)  18 
 19  SmallIntegerField(IntegerField):  20         - 小整數 -32768 ~ 32767
 21 
 22  PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)  23         - 正小整數 0 ~ 32767
 24  IntegerField(Field)  25         - 整數列(有符號的) -2147483648 ~ 2147483647
 26 
 27  PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)  28         - 正整數 0 ~ 2147483647
 29 
 30  BigIntegerField(IntegerField):  31         - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
 32 
 33  BooleanField(Field)  34         - 布爾值類型  35 
 36  NullBooleanField(Field):  37         - 能夠爲空的布爾值  38 
 39  CharField(Field)  40         - 字符類型  41         - 必須提供max_length參數, max_length表示字符長度  42 
 43  TextField(Field)  44         - 文本類型  45 
 46  EmailField(CharField):  47         - 字符串類型,Django Admin以及ModelForm中提供驗證機制  48 
 49  IPAddressField(Field)  50         - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制  51 
 52  GenericIPAddressField(Field)  53         - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6  54         - 參數:  55             protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
 56             unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓此功能,須要protocol="both"
 57 
 58  URLField(CharField)  59         - 字符串類型,Django Admin以及ModelForm中提供驗證 URL  60 
 61  SlugField(CharField)  62         - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號)  63 
 64  CommaSeparatedIntegerField(CharField)  65         - 字符串類型,格式必須爲逗號分割的數字  66 
 67  UUIDField(Field)  68         - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證  69 
 70  FilePathField(Field)  71         - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能  72         - 參數:  73  path, 文件夾路徑  74                 match=None, 正則匹配  75                 recursive=False, 遞歸下面的文件夾  76                 allow_files=True, 容許文件  77                 allow_folders=False, 容許文件夾  78 
 79  FileField(Field)  80         - 字符串,路徑保存在數據庫,文件上傳到指定目錄  81         - 參數:  82             upload_to = "" 上傳文件的保存路徑  83             storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage  84 
 85  ImageField(FileField)  86         - 字符串,路徑保存在數據庫,文件上傳到指定目錄  87         - 參數:  88             upload_to = "" 上傳文件的保存路徑  89             storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage  90             width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串)  91             height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串)  92 
 93  DateTimeField(DateField)  94         - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]  95 
 96  DateField(DateTimeCheckMixin, Field)  97         - 日期格式      YYYY-MM-DD  98 
 99  TimeField(DateTimeCheckMixin, Field) 100         - 時間格式 HH:MM[:ss[.uuuuuu]] 101 
102  DurationField(Field) 103         - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型 104 
105  FloatField(Field) 106         - 浮點型 107 
108  DecimalField(Field) 109         - 10進制小數 110         - 參數: 111  max_digits,小數總長度 112  decimal_places,小數位長度 113 
114  BinaryField(Field) 115         - 二進制類型
字段

 經常使用字段類型:

1 BooleanField: 布爾類型字段
 2 CharField: 字符串類型字段
 3 DateField: 日期字段
 4 DateTimeField:日期時間字段
 5 DecimalField:(精確)小數字段
 6 EmailField:Email字段
 7 FileField:文件字段
 8 FloatField:(浮點數)小數字段
 9 ImageField:圖片字段
10 IntegerField:整數字段
11 IPAddressField:IP字段
12 SmallIntegerField:小整數字段
13 TextField:文本字段
14 URLField:網址地址字段

  

 5、查看數據庫的sql語句(加在settings.py)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

 

Django ORM 經常使用字段和參數

經常使用字段

AutoField

int自增列,必須填入參數 primary_key=True。當model中若是沒有自增列,則自動會建立一個列名爲id的列。

IntegerField

一個整數類型,範圍在 -2147483648 to 2147483647。

CharField

字符類型,必須提供max_length參數, max_length表示字符長度。

DateField

日期字段,日期格式  YYYY-MM-DD,至關於Python中的datetime.date()實例。

DateTimeField

日期時間字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],至關於Python中的datetime.datetime()實例。

字段參數

null

用於表示某個字段能夠爲空。

unique

若是設置爲unique=True 則該字段在此表中必須是惟一的 。

db_index

若是db_index=True 則表明着爲此字段設置數據庫索引。

default

爲該字段設置默認值。

時間字段獨有

DatetimeField、DateField、TimeField這個三個時間字段,均可以設置以下屬性。

auto_now_add

配置auto_now_add=True,建立數據記錄的時候會把當前時間添加到數據庫。

auto_now

配置上auto_now=True,每次更新數據記錄的時候會更新該字段。

關係字段

ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關係,通常把ForeignKey字段設置在 '一對多'中'多'的一方。

ForeignKey能夠和其餘表作關聯關係同時也能夠和自身作關聯關係。

字段參數

to

設置要關聯的表

to_field

設置要關聯的表的字段

related_name

反向操做時,使用的字段名,用於代替原反向查詢時的'表名_set'。

例如:

class Classes(models.Model):
    name = models.CharField(max_length=32)

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes")

當咱們要查詢某個班級關聯的全部學生(反向查詢)時,咱們會這麼寫:

models.Classes.objects.first().student_set.all()

當咱們在ForeignKey字段中添加了參數 related_name 後,

class Student(models.Model):
    name = models.CharField(max_length=32)
    theclass = models.ForeignKey(to="Classes", related_name="students")

當咱們要查詢某個班級關聯的全部學生(反向查詢)時,咱們會這麼寫:

models.Classes.objects.first().students.all()

related_query_name

反向查詢操做時,使用的鏈接前綴,用於替換表名。

on_delete

當刪除關聯表中的數據時,當前表與其關聯的行的行爲。

models.CASCADE
刪除關聯數據,與之關聯也刪除


models.DO_NOTHING
刪除關聯數據,引起錯誤IntegrityError


models.PROTECT
刪除關聯數據,引起錯誤ProtectedError


models.SET_NULL
刪除關聯數據,與之關聯的值設置爲null(前提FK字段須要設置爲可空)


models.SET_DEFAULT
刪除關聯數據,與之關聯的值設置爲默認值(前提FK字段須要設置默認值)


models.SET

刪除關聯數據,
a. 與之關聯的值設置爲指定值,設置:models.SET(值)
b. 與之關聯的值設置爲可執行對象的返回值,設置:models.SET(可執行對象)

def func():
    return 10

class MyModel(models.Model):
    user = models.ForeignKey(
        to="User",
        to_field="id",
        on_delete=models.SET(func)
    )

db_constraint

是否在數據庫中建立外鍵約束,默認爲True。

OneToOneField

一對一字段。

一般一對一字段用來擴展已有字段。

示例

一對一的關聯關係多用在當一張表的不一樣字段查詢頻次差距過大的狀況下,將本能夠存儲在一張表的字段拆開放置在兩張表中,而後將兩張表創建一對一的關聯關係。

class Author(models.Model):
    name = models.CharField(max_length=32)
    info = models.OneToOneField(to='AuthorInfo')
    

class AuthorInfo(models.Model):
    phone = models.CharField(max_length=11)
    email = models.EmailField()

 

字段參數

to

設置要關聯的表。

to_field

設置要關聯的字段。

on_delete

同ForeignKey字段。

ManyToManyField

用於表示多對多的關聯關係。在數據庫中經過第三張表來創建關聯關係。

字段參數

to

設置要關聯的表

related_name

同ForeignKey字段。

related_query_name

同ForeignKey字段。

symmetrical

僅用於多對多自關聯時,指定內部是否建立反向操做的字段。默認爲True。

舉個例子:

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self")

此時,person對象就沒有person_set屬性。

class Person(models.Model):
    name = models.CharField(max_length=16)
    friends = models.ManyToManyField("self", symmetrical=False)

此時,person對象如今就可使用person_set屬性進行反向查詢。

through

在使用ManyToManyField字段時,Django將自動生成一張表來管理多對多的關聯關係。

但咱們也能夠手動建立第三張表來管理多對多關係,此時就須要經過through來指定第三張表的表名。

through_fields

設置關聯的字段。

db_table

默認建立第三張表時,數據庫中表的名稱。

多對多關聯關係的三種方式 

方式一:自行建立第三張表

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")

方式二:經過ManyToManyField自動建立第三張表

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")

方式三:設置ManyTomanyField並指定自行建立的第三張表

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")

 

注意:

當咱們須要在第三張關係表中存儲額外的字段時,就要使用第三種方式。

可是當咱們使用第三種方式建立多對多關聯關係時,就沒法使用set、add、remove、clear方法來管理多對多的關係了,須要經過第三張表的model來管理多對多關係。

元信息

ORM對應的類裏面包含另外一個Meta類,而Meta類封裝了一些數據庫的信息。主要字段以下:

db_table

ORM在數據庫中的表名默認是 app_類名,能夠經過db_table能夠重寫表名。

index_together

聯合索引。

unique_together

聯合惟一索引。

ordering

指定默認按什麼字段排序。

只有設置了該屬性,咱們查詢到的結果才能夠被reverse()。

相關文章
相關標籤/搜索