第23章數據庫
1、一大波model操做
1. 建立數據庫表
# 單表
# app01_user ==> tb1
# users
class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
class Meta:
# 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
db_table = "tb1"
index_together = [
("name", 'pwd'),
]
# 最左前綴的模式:
# select * from where name='xx'
# select * from where name='xx' and email = 'xx'
# select * from where email = 'xx' # 沒法命中索引
unique_together = (("driver", "restaurant"),)
verbose_name = 「上課記錄」
verbose_name_plural=「「上課記錄」」
# 一對多/一對一/多對多
一對多:
def func():
return 5
class UserType(models.Model):
name = models.CharField(max_length=32)
class User(models.Model):
name = models.CharField(max_length=32)
pwd = models.CharField(max_length=32)
.... ForiegnKey(to="UserType",to_field='id',on_delete=models.SET(func))
# delete from user where id=1
# delete from UserType where id=1 # 報錯
# UserType.objects.filter(id=1).delete()
# 正向
# v = User.objects.all()
# for item in v:
# item.user
# item.pwd
# item.ut.name
# User.objects.all().values('user','ut__name')
# 反向
# v = UserType.objects.all()
# for item in v:
# item.name
# item.id
# item.user_set.all() # item.b.all()
# models.UserType.objects.all().values('name','user__pwd')
多對多:
a. django建立第三張表
m2m.remove
m2m.add
m2m.set
m2m.clear
m2m.filter()
b. 自定義第三張表(無m2m字段)
本身鏈表查詢
c. 自定義第三張表(有m2m字段)
# 經過m2m字段查操做
# 經過m2m字段 clear
2. 操做數據庫表
- 基本操做
- QuerySet中的方法:
- 返回QuerySet類型(select_related,prefetch_related)
select_related
users = models.User.objects.all().select_related('ut')
for row in users:
print(row.user,row.pwd,row.ut_id)
print(row.ut.name)
print(row.tu.name) # 再發起一次SQL請求
prefetch_related
users = models.User.objects.filter(id__gt=30).prefetch_related('ut','tu')
# select * from users where id > 30
# 獲取上一步驟中全部的ut_id=[1,2]
# select * from user_type where id in [1,2]
# select * from user_type where id in [1,2]
for row in users:
print(row.user,row.pwd,row.ut_id)
print(row.ut.name)
3. 數據驗證(弱)
full_clean進行驗證
- 每一個字段的正則
- clean鉤子
2、Form操做
1. 數據驗證(強大)
- 每個字段(正則,字段鉤子)
- clean
- _post_clean
對於錯誤信息:__all__
4、序列化操做
ErrorDict
- 自定義encoder
QuerySet
第一種:
from django.core import serializers
v = models.tb.objects.all()
data = serializers.serialize("json", v)
第二種:
import json
from datetime import date
from datetime import datetime
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field, datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field, date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self, field)
v = models.tb.objects.values('id','name','ctime')
v = list(v)
v = json.dumps(v,cls=JsonCustomEncoder)django