Django学习【第5篇】:Django 之ORM数据库操作
django之ORM数据库操作
一. ORM介绍
映射关系:
表名 -----------------》 类名
字段 -----------------》 属性
表记录 ----------------》 类实力化对象
ORM的两大功能:
操作表:
-创建表
-修改表
-删除表
操作数据行:
-增删改查
ORM 利用 pymysql 第三方工具链接数据库
Django 没办法帮我们创建数据库,只有我们创建完告诉它,让django去链接。
二. 创建表之前的准备工作
1.手动创建数据库
2.在settings.py里面配置mysql数据库链接
# 修改django默认的数据库的sqlite3为mysql DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', #通过这个去链接mysql 'NAME': 'djangotsgl', 'USER':'root', 'PASSWORD':'123456', 'HOST':'localhost', 'PORT':'3306', } }
这样写上以后django会默认的去链接数据库,这是会报错,解决的办法是去app中的__init__文件配置
3.app01中的__init__文件
import pymysql pymysql.install_as_MySQLdb()
4.创建数据库表
models.py
class Book(models.Model): #必须要继承的 nid = models.AutoField(primary_key=True) #自增id(可以不写,默认会有自增id) title = models.CharField(max_length=32) publishDdata = models.DateField() #出版日期 author = models.CharField(max_length=32) price = models.DecimalField(max_digits=5,decimal_places=2) #一共5位,保留两位小数
执行命令创建:
python manage.py makemigrations 创建脚本
python manage.py migrate 迁移
具体实际的例子:
models.py

urls.py

views.py

template/publisher_list.html

5.查看数据库的sql语句(加在settings.py)
查看数据库执行代码 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
补充细节知识点:(ORM查询相关)
一. 多对多的正反向查询
class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") classes = models.ManyToManyField(verbose_name="所属班级",to="Class") def __str__(self): return self.name
题目1.查找肖锋老师所带的班级
# 方式一:基于对象的查找 obj = models.Teacher.objects.filter(name="肖锋").first() print(obj.classes.all()) print("肖锋老师带的班级",obj.classes.values("name")) # 方式二:基于双下划线的查找 obj_cls = models.Teacher.objects.filter(name="肖锋").values("classes__name") print("肖锋老师带的班级",obj_cls)
注意点:要说明的是多对多的查询用.all,, 查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此,
总结: 不管是一对多,还是多对多,要是查询多的那一方就得用all()
待续...

浙公网安备 33010602011771号