迴圈結構-while迴圈
阿新 • • 發佈:2022-03-16
目錄
Django ORM
ORM: 物件對映關係程式
通過orm將程式語言的物件模型和資料庫的關係模型建立對映關係,這樣我們在使用程式語言對資料庫進行操作的時候可以直接使用程式語言的物件模型進行操作就可以了,而不是直接使用sql語言。
python與MySQL對映關係
Python | 對映 | MySQL |
---|---|---|
類 | ---> | 表 |
物件 | ---> | 表裡面的資料 |
物件點屬性 | ---> | 欄位對應的值 |
ORM實操之資料庫遷移
我們的模型類需要解除安裝應用下的models.py檔案中
from django.db import models # Create your models here. class User(models.Model): # id int primary key auto_increment id = models.AutoField(primary_key=True) # name varchar(32) name = models.CharField(max_length=32) # 引數必須跟上max_len # age int age = models.IntegerField()
資料庫的遷移命令
- 只要修改了models.py檔案執行了資料庫相關的命令,就要重新執行下面兩條命令:python36 manage.py makemigrations、python36 manage.py migrate
- 或者開啟Tools,點選RUN manage.py Task,輸入makemigrations
1.將資料庫修改操作先記錄在'本本'(對應的migrations資料夾中) python36 manage.py makemigrations 2.真正的執行資料庫遷移操作,同步到資料庫 python36 manage.py migrate # 自己建立的表user以'應用名_表名'的形式建立,app01_user=
不指定id欄位 那麼orm會自動建立id欄位
# 如果不指定主鍵,那麼orm會自動建立一個名為id的主鍵欄位
class user(model.Model):
username = model.CharField(max_length=32)
ORM實操之欄位的修改
# 原來的表
class user(model.Model):
username = model.CharField(max_length=32)
# 增加欄位(兩種方法)
password = model.IntegerField('密碼',null=True) # 該欄位可以為空
is_delete = models.IntegerField(default=0) # 預設值
# 修改欄位
直接改程式碼,然後執行makemigrations,資料庫遷移
# 刪除
同上
ORM實操之資料的增刪改查
username = request.POST.get('username')
# 獲取使用者post從頁面提交的資料,username是獲取到使用者提交的資料
# 1.查詢資料
# select * from user where name=username;
user_obj_list = models.User.objects.filter(name=username) # 獲取到的是列表,看成列表套資料物件
obj_info = user_obj_list[0]
# 獲取id、name、age
print(obj_info.id,
obj_info.name,
obj_info.age) # 1 hammer 18
# 或這下面這樣提取列表資料也可以
user_obj = models.User.objects.filter(name=username).first()
'''如果使用者提交的資訊不存在返回None'''
# 登入功能示例
user_check = models.User.objects.filter(name=username,password=password).first() # 等價於select * from user where name=username and pwd = password
if user_check:
return HttpResponse('登入成功')
# 2.新增資料
# insert into user(name,pwd) values(username,password);
models.User.objects.create(name=username,pwd=password)
# 3.查詢所有的資料,展示所有資料到前端頁面,通過for迴圈在html頁面獲取表資料
# select * from user;
models.User.objects.all() # 返回列表[obj1,obj2,obj3,obj4]
# 4.修改資料
models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
# 或者
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
# 5.刪除資料
models.User.objects.filter(id=delete_id).delete()
資料庫同步
資料庫遷移命令,python manage.py makemigrations
inspectdb 表名 反向操作資料庫,反向輸出sql語句對應的類
如果inspectdb後不跟表名,那麼就會將該資料庫內的所有表反向解析成類(python語句)
操作:
1.先執行資料庫遷移命令 完成連結
python manage.py makemigrations
2.檢視程式碼
python manage.py inspectdb
class AuthUser(models.Model):
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_superuser = models.IntegerField()
username = models.CharField(unique=True, max_length=150)
first_name = models.CharField(max_length=150)
last_name = models.CharField(max_length=150)
email = models.CharField(max_length=254)
is_staff = models.IntegerField()
is_active = models.IntegerField()
date_joined = models.DateTimeField()
class Meta:
managed = False
db_table = 'auth_user'
ORM建立表關係
表與表之間的關係有以下三種
一對一、一對多、多對多
ORM建立外來鍵欄位的位置
- 一對多: 建立在多的一方
- 一對一: 建立在任意一方都可以,建議建立在使用頻率高的一方
- 多對多: 可以選擇建立第三張表,也可以建在使用頻率高的一方
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 總共8位,小數部分佔2位
# 作者外來鍵
Publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
# 作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
Author_Detail = models.OneToOneField(to='Author_Detail',on_delete=models.CASCADE)
# 作者詳情表
class Author_Detail(models.Model):
phone = models.BigIntegerField()
Email = models.EmailField()
# 出版社表
class Publish(models.Model):
name = models.CharField(max_length=32)
address = models.CharField(max_length=32)
注意
- 外來鍵不需要寫id,會自動新增id,比如author_id,不需要寫_id,orm自動補充
- orm自動建立書籍和作者的第三張表,只有多對多關係表被單獨創建出來
- 外來鍵被當做虛擬欄位,建立表完成後,不會例項化出來,而是告訴orm建立第三張表的關係
- django2.0版本以上,在建立外來鍵和一對一關係的時候,需要新增級聯更新引數on_delete = model.CASCADE,不然報錯,只有OneToOneField和F哦reignKey需要這樣寫,ManyToManyField不需要