python學習筆記(92) Django基礎之ORM
1. ORM已經的學過的內容:
1. Django項目如何使用ORM連接MySQL
1. 手動創建數據庫
2. 在settings.py裏面配置一下數據庫的連接信息(告訴Django連接哪一個數據庫)
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘, # 連接數據庫的類型
‘NAME‘: ‘day62xiawu‘, # 數據庫名字
‘HOST‘: ‘127.0.0.1‘, # IP
‘PORT‘: 3306, # 端口
‘USER‘: ‘root‘, # 用戶名
‘PASSWORD‘: ‘123456‘, # 密碼
}
}
3. 在和settings.py同目錄下的__init__.py文件中,告訴Django用pymysql代替MySQLdb來連接數據庫
import pymysql
pymysql.install_as_MySQLdb()
4. 在app/models.py中,定義類,類一定要繼承models.Model
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
def __str__(self):
return self.title
5. 執行兩條命令
1. 在哪兒執行?
在項目的根目錄(有manage.py文件的那個目錄)
2. 命令
python manage.py makemigrations --> 將models.py文件中的改動記錄在小本本(app/migrations/00xx_****.py)上
python manage.py migrate --> 將改動翻譯成SQL語句,去數據庫中執行
2. 表和表之間的關系
1. 一對多(出版社和書)
publisher = models.ForeignKey(to="Publisher")
在數據庫中:
有沒有publisher這個字段?
數據庫中實際 生成的是一個 publisher_id 字段
2. 多對多(作者和書)
books = models.ManyToManyField(to="Book") # 這個models是Django內置模塊
在數據庫中:
是通過第三張表建立的關系
3. 增刪改查操作
1. 單表增刪改查
增:
models.Publisher.objects.create(name="沙河出版社") # 這個models是models.py
查:
models.Publisher.objects.get(id=1)
models.Publisher.objects.get(name="沙河出版社")
刪:
models.Publisher.objects.get(id=1).delete()
改:
obj = models.Publisher.objects.get(id=1)
obj.name = "沙河第二出版社"
obj.save()
2. 外鍵的增刪改查
增、刪、查同上
book_obj = models.Book.objects.get(id=1)
book_obj.publisher 是什麽? *****
和我這本書關聯的出版社對象
book_obj.publisher.id 和我這本書關聯的出版社的id值
book_obj.publisher.name 和我這本書關聯的出版社的名稱
book_obj.publisher_id 是什麽?
和我這本書關聯的出版社的id值
3. 多對多操作
1. 查id為1的作者都寫過的書?
author_obj = models.Author.objects.get(id=1)
author_obj.books.all() --> 和我這個作者關聯的所有書對象
2. 想給作者綁定多本書?
author_obj = models.Author.objects.get(id=1)
author_obj.books.set([1,2,3]) --> 把id是1、2、3的書和我這個作者關聯上
反射本地文件的類:
if hasattr(sys.modules[__name__], "Person"):
class_name = getattr(sys.modules[__name__], "Person")
#####################################################
ORM: Object Relational Mapping 對象關系映射
1. Django ORM常用字段:
1. AutoField --> 自增
2. CharField --> varchar(xx) 必須指定max_length
3. ForeignKey --> 外鍵
4. ManyToManyField --> 多對多關聯
5. DateField
6. DateTimeField # 相當於DateField加了Time
auto_now_add=Ture # 生成時把當前時間填入
auto_now=Ture # 修改時把當前時間填入
7. IntegerField # 長度不夠存手機號,用CharField
2. 自定義char字段
class FixedCharField(models.Field):
"""
自定義的char類型的字段類
"""
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length
super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)
def db_type(self, connection):
"""
限定生成數據庫表的字段類型為char,長度為max_length指定的值
"""
return ‘char(%s)‘ % self.max_length
3. 常用的字段參數
1. null # 可以為空
2. default
3. unique
4. db_index # 建立索引
5. DateField和DateTimeField才有的參數:
auto_now_add=True --> 創建數據的時候自動把當前時間賦值
auto_add=True --> 每次更新數據的時候更新當前時間
上述兩個不能同時設置!!!
6. class Meta: # 寫在類內部
db_table = "表名" # 指定表名(不要app01_person)
7. to # 要關聯的表
8. to_field # 指定要關聯表的字段
9. db_constraint=False # 外鍵軟關聯
4. 字段合集:
AutoField(Field)
- int自增列,必須填入參數 primary_key=True
BigAutoField(AutoField)
- bigint自增列,必須填入參數 primary_key=True
註:當model中如果沒有自增列,則自動會創建一個列名為id的列
from django.db import models
class UserInfo(models.Model):
# 自動創建一個列名為id的且為自增的整數列
username = models.CharField(max_length=32)
class Group(models.Model):
# 自定義自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
SmallIntegerField(IntegerField):
- 小整數 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整數 0 ~ 32767
IntegerField(Field)
- 整數列(有符號的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整數 0 ~ 2147483647
BigIntegerField(IntegerField):
- 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
BooleanField(Field)
- 布爾值類型
NullBooleanField(Field):
- 可以為空的布爾值
CharField(Field)
- 字符類型
- 必須提供max_length參數, max_length表示字符長度
TextField(Field)
- 文本類型
EmailField(CharField):
- 字符串類型,Django Admin以及ModelForm中提供驗證機制
IPAddressField(Field)
- 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
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)
- 二進制類型
python學習筆記(92) Django基礎之ORM