【Django】之Model操作数据库前提:创建好项⽬⽂件demo,app名为app01.
基本实现步骤:
1、创建数据库(MySQL)
2、修改setting.py数据库配置
Django可以配置使⽤sqlite3,mysql,oracle,postgresql等数据库。Django默认使⽤的是sqlite3数据库,settigs.py⾥⾯:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # 默认使⽤的数据库引擎
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # 指定数据库所在的路径
}
}
Django项⽬也可以配置使⽤mysql数据库,使⽤如下配置:
DATABASES = {
'default': {
'ENGINE': 'django.sql', # 表⽰使⽤的是mysql数据库的引擎
'NAME': 'db1', # 数据库的名字,可以在mysql的提⽰符下先创建好
'USER':'root', # 数据库⽤户名
'PASSWORD':'', # 数据库密码
'HOST':'', # 数据库主机,留空默认为"localhost"
'PORT':'3306', # 数据库使⽤的端⼝
}
}
3、demo.__init__.py⽂件增加如下代码
import pymysql
pymysql.install_as_MySQLdb()
4、app.01⽬录下models.py⽂件,创建数据库表
class UserGroup(models.Model):
"""
部门
"""
title = models.CharField(max_length=32)
class UserInfo(models.Model):
"""
员⼯
"""
nid = models.AutoField(primary_key=True) # 可不写,默认会⽣成⼀列id,int类型,⾃增
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
ug = models.ForeignKey("UserGroup",null=True) # UserGroup表的外键,可为空值
"""
注意:Python2.0以上的版本,需要在外键后⾯加上on_delete=models.CASCADE
例如:ug = models.ForeignKey("UserGroup",null=True,on_delete=models.CASCADE)
这⼀列在表格中的列名为 ug_id
"""
5、demo.settings.py⽬录下,在如下图位置,增加‘app01’.,如果在创建项⽬时已经创建app01,则系统会⾃动⽣成(如图)。
6、创建数据库表
执⾏命令: python manage.py makemigrations
python manage.py migrate
数据库操作/单表操作
def index(request):
mysql下载app
# 新增 create
models.ate(title='销售部')
models.ate(username='⽤户1',password='123',ug_id=1)
# --------------------------------------------------- #
# 查 all / filter / values / values_list
group_list = models.UserGroup.objects.all()
"""
print(group_list) <QuerySet [<UserGroup: UserGroup object (1)>]>
group_list是QuerySet类型,类似于⼀个表
在ORM中,类代表表,对象代表⼀⾏数据
"""
for row in group_list:
print(row.id)
print(row.title)
info_list = models.UserInfo.objects.filter(nid=1) # id等于1的数据
info_list = models.UserInfo.objects.filter(nid__gt=1) # id ⼤于 1
info_list = models.UserInfo.objects.filter(nid__lt=1) # id ⼩于1
obj = models.UserInfo.objects.all().values('username','password')
# 取UserInfo表 username,password两列的值
# 结果仍为QuerySet类型,QuerySET[{'username':'xx','name':'xx'}]
bj = models.UserInfo.objects.all().values_list('username','password')
# QuerySet[('李⼆','123')]
# --------------------------------------------------- #
# 删除 delete
models.UserInfo.objects.filter(nid=3).delete()
# --------------------------------------------------- #
# 更新 update
models.UserGroup.objects.filter(id=1).update(title='公关部')
数据库操作/连表操作
def index(request):
# 查
infos = models.UserInfo.objects.all()
for row in infos:
print(row.username,row.password,row.ug_id,row.ug.title)
"""
直接连表 row.ug.title UserInfo表中的外键ug即代表了UserGroup表中的⼀⾏
"""
# --------------------------------------------------- #
# UserInfo,ug是FK字段 - 正向操作
obj = models.UserInfo.objects.all().first()
print(obj.username,obj.password,obj.ug.title)
# UserGroup,表名⼩写_set.all() - 反向操作
obj = models.UserGroup.objects.all().first()
print(obj.id,obj.title,obj.userinfo_set.all()) # 1 公关部 <QuerySet [<UserInfo: UserInfo object (2)>]>
for row in obj.userinfo_set.all():
print(row.username,row.password) # ⽤户1 123
return HttpResponse('')
select_related、prefetch_related
obj_list = models.UserInfo.objects.all() # => select * from userinfo
print(obj_list) # <QuerySet [<UserInfo: 1-李明明>, <UserInfo: 2-刘珊>]>
obj_list1 = models.UserInfo.objects.all().values("ut__title") # select * from userinfo inner join usertype on ... print(obj_list1) # <QuerySet [{'ut__title': '销售部'}, {'ut__title': '公关部'}]>
obj_list2 = models.UserInfo.objects.all().select_related("ut") # 联表查询
# obj_list2 = models.UserInfo.objects.all().select_related("ut","gp") # 三张表联表查询
for row in obj_list2:
print(row.ut.title) # 销售部 [换⾏] 公关部
"""
ForeignKey会降低性能,因此有些公司不做外键。
prefetch_related 不做连表,做多次查询,效率更⾼
"""
obj_list3= models.UserInfo.objects.all().prefetch_related('ut')
# 做两次查询
# select * from userinfo
# Django内部:ut_id = [1,2]
# select * from usertype where id in [1.2]
for row in obj_list3:
print(row.id,row.ut.title)
"""
1 销售部
2 公关部
"""
数据库字段
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论