1. 程式人生 > >Python學習----第七模塊筆記(Web開發進階之Django數據庫操作)

Python學習----第七模塊筆記(Web開發進階之Django數據庫操作)

long 機制 idt 4.5 gen git 表之間 protoc 小數

4、Django ORM

4.1、連接數據庫

創建Django工程後運行該工程,會在工程根目錄下創建db.sqlite3文件,為Django自帶的sqlite3數據庫(Django自帶的功能也需要數據庫支持),如果沒有在settings.py文件中進行配置的話,數據將會保存在該數據庫中。

Django使用MySQL:

# 修改settings.py中DATABASES = {}的內容為
DATABASES = {
    default: {
    ENGINE: django.db.backends.mysql,
    NAME:數據庫名稱,
    USER: 
用戶名, PASSWORD: 密碼, HOST: 主機, PORT: 端口, } } # Python 3.x中讓Django使用pymysql連接MySQL,在工程配置目錄下的__init__.py文件中添加如下內容 import pymysql pymysql.install_as_MySQLdb()

4.2、創建表結構

在Django中定義一個類來自動生成表結構,類寫在APP目錄下的models.py文件中。

要使models.py文件生效,需要先在settings.py文件中註冊該APP:

# 在settings.py中的INSTALLED_APPS = 下添加
‘APP名’,

在models.py文件下編寫:

from django.db import models


class Foo(models.Model):
    xxx = models.字段類型(參數)

以下為具體字段類型:

# 自增
AutoField(Field),int自增列,必須填入參數 primary_key=True
BigAutoField(AutoField),bigint自增列,必須填入參數 primary_key=True
# 註:當model中如果沒有自增列,則自動會創建一個列名為id的列

# 數字
SmallIntegerField(IntegerField),小整數 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField),正小整數 0 ~ 
32767 IntegerField(Field),整數列(有符號的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField),正整數 0 ~ 2147483647 BigIntegerField(IntegerField),長整型(有符號的) -9223372036854775808 ~ 9223372036854775807 自定義無符號整數字段 class UnsignedIntegerField(models.IntegerField): def db_type(self, connection): return integer UNSIGNED PS: 返回值為字段在數據庫中的屬性,Django字段默認的值為: 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), # 布爾 BooleanField(Field),布爾值類型 NullBooleanField(Field),可以為空的布爾值 # 字符 CharField(Field),字符類型,必須提供max_length參數, max_length表示字符長度 TextField(Field),文本類型 EmailField(CharField),字符串類型,Django Admin以及ModelForm中提供驗證機制 GenericIPAddressField(Field),字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6 - 參數: protocol,用於指定Ipv4或Ipv6, both,"ipv4","ipv6" unpack_ipv4, 如果指定為True,則輸入::ffff:192.0.2.1時候,可解析為192.0.2.1,開啟刺功能,需要protocol="both" URLField(CharField),字符串類型,Django Admin以及ModelForm中提供驗證URL SlugField(CharField),字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、連接符(減號) CommaSeparatedIntegerField(CharField),字符串類型,格式必須為逗號分割的數字 UUIDField(Field),字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證 FilePathField(Field),字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能 - 參數: path, 文件夾路徑 match=None, 正則匹配 recursive=False, 遞歸下面的文件夾 allow_files=True, 允許文件 allow_folders=False, 允許文件夾 FileField(Field),字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage ImageField(FileField),字符串,路徑保存在數據庫,文件上傳到指定目錄 - 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) # 日期時間 DateTimeField(DateField),日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field),日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field),時間格式 HH:MM[:ss[.uuuuuu]] DurationField(Field),長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型 # 浮點 FloatField(Field),浮點型 DecimalField(Field),10進制小數 - 參數: max_digits,小數總長度 decimal_places,小數位長度 # 二進制 BinaryField(Field),二進制類型

以下為具體參數:

null                 -> 是否為空
default              -> 默認值
primary_key          -> 主鍵
db_column            -> 列名
db_index             -> 索引
unique               -> 唯一索引
unique_for_date      -> 基於日期的唯一索引
unique_for_month     -> 基於月份的唯一索引
unique_for_year      -> 基於年份的唯一索引
auto_now             -> 創建時自動生成時間
auto_now_add         -> 更新時自動更新時間,只能在使用obj.save()更新時生效

# 以下參數應用與Django Admin中
choices              -> 顯示下拉框,避免連表查詢
blank                -> 是否可以為空
verbose_name         -> 顯示字段中文
editable             -> 是否可以編輯
error_messages       -> 錯誤信息
help_text            -> 提示
validators           -> 自定義錯誤信息

表結構創建完成後,使用以下命令寫入數據庫:

python manage.py makemigrations
python manage.py migrate

4.3、在表中添加數據

from APP import models
models.類名.objects.create(xxx= ,...)

dict = {}
models.類名.objects.create(**dict)

obj = models.類名(xxx= ,...)
obj.save()

4.4、查詢數據

查詢全部數據

from APP import models

# 有以下三種方式可以查詢全部數據

models.類名.objects.all()
# 獲取一個QuerySet(類似列表),內部元素都是對象

models.類名.objects.all().values(字段, ...)
# 獲取一個QuerySet,內部元素都是字典

models.類名.objects.all().values_list(字段, ...)
# 獲取一個QuerySet,內部元素都是元組

條件查詢

from APP import models

models.類名.objects.filter(條件1, 條件2, ...)
# 條件查詢

models.類名.objects.filter(條件1, 條件2, ...).first()
# 查詢符合條件的第一條記錄

dict = {條件1, 條件2, ...}
models.類名.objects.filter(**dict)

# 條件表達式
    - = ,等於
    - __gt = ,大於
    - __lt = ,小於
    - __gte = ,大於等於
    - __lte = , 小於等於

models.類名.objects.get(條件1, 條件2, ...)
# 使用該方式獲取時數據不存在會報錯

4.5、修改和刪除數據

要進行修改和刪除操作,都必須先查詢到數據,然後進行下一步操作。

from APP import models

# 修改,兩種方式
models.類名.objects.filter(條件).update(xxx=‘‘, ...)

dict = {}
models.類名.objects.filter(條件).update(**dict)

obj = models.類名.objects.filter(條件)
obj.xxx = 新值
obj.save()

# 刪除
models.類名.objects.filter(條件).delete()

4.6、表間一對多關聯操作

from APP import models


class Foo1(models.Model):
    foo1_xxx = models.字段類型()


class Foo2(models.Model):
    foo2_xxx = models.字段類型()
    xxx1 = models.ForeignKey(to = "Foo1", to_field = "id")
    # 也可以簡寫為xxx1 = models.ForeignKey("Foo1"),將自動與表的主鍵關聯

# Foo2表中將生成xxx1_id列,關聯Foo1表的id列,而此處的xxx1為一個包含Foo1表內容的對象
# 通過Foo2表查詢Foo1中的內容
obj = models.Foo2.objects.filter(id="1")
obj.xxx1.foo1_xxx

可以使用__進行跨表查詢:

models.Foo2.objects.all().values(xxx1__foo1_xxx)

4.7、表間多對多關聯操作

為了實現兩張表之間的多對多關聯,必須借助第三張表實現;用以下兩種方式創建兩張表間的多對多關聯:

from APP import models

# 自定義關系表
class Foo1(models.Model):
    foo1_xxx = models.字段類型()


class Foo2(models.Model):
    foo2_xxx = models.字段類型()


class Foo1ToFoo2(models.Model):
    f1 = models.ForeignKey(to="Foo1", to_field="id")
    f2 = models.ForeignKey(to="Foo2", to_field="id")
    # 通過創建兩個ForeignKey來關聯兩個表
# 使用該方式的好處是可定制性強,在第三張表中可以自定義字段


# Django自動創建關系表
class Foo1(models.Model):
    foo1_xxx = models.字段類型()


class Foo2(models.Model):
    foo2_xxx = models.字段類型()
    x = models.ManyToManyField("Foo1")
# 使用該方式Django將自動維護關聯的第三張表,用戶無法對該表進行操作

Django自動創建關系表情況下的第三張表操作:

from APP import models

obj = models.Foo2.objects.filter(id="1")

# 添加
obj.x.add(n)
obj.x.add(n, n1, ...)
obj.x.add(*[n, n1, ...])

# 刪除
obj.x.remove(n)
obj.x.remove(n, n1, ...)
obj.x.remove(*[n, n1, ...])

# 清除所有
obj.x.clear()

# 重新設置值
obj.x.set([n, n1, ...])

# 查詢
obj.x.all()
obj.x.all().filter(xxx="...")

Python學習----第七模塊筆記(Web開發進階之Django數據庫操作)