django ORM
缺点:封装程度太高,有时候sql语句的效率偏低
ORM能够让一个不会sql语句的python程序员也能够简单快捷地操作数据库
| 类 | 表 |
|---|---|
| 对象 | 记录 |
| 对象属性 | 记录字段 |
去应用下的models.py文件中书写模型类,用来创建数据表,
orm不会创建数据库
from django.db import models
#继承models.Model
class User(models.Model):
id=models.AutoField(primary_key=True)
username=models.CharField(max_length=32)
#CharField字段一定要加max_length参数,否则会报错
password=models.CharField(max_length=32)
由于一张表中必须要有一个主键字段,且一般都是id字段,所以当定义模板表没有定义主键字段的时候,orm会自动创建一个名为id的主键字段
数据库迁移命令
先切换到项目manage.py所在的文件夹,再执行
可以在命令行里面执行
-
python8 manage.py makemigrations
将操作记录到migrations文件夹中。类似于日志
-
python8 manage.py migrate
将操作真正的同步到数据库中
只要在models.py中修改了与数据库相关的代码,就要执行上面两条命令
还可以在pycharm里面
- tools菜单——Run manage.py task 命令
- 然后在命令行只需要输入: makemigrations 和 migrate 就可以了
python manage.py makemigrations
利用orm来进行字段的增删改
增加字段
新增的字段需要值,可以设置默认值,也可以设为空,还可以在终端输入值
hobby=models.CharField(max_length=32,default='study') #设置字段默认值
info=models.CharField(max_length=32,null=True) #该字段可以为空
删字段(注释掉类中相应的字段)会同时删除数据,要非常谨慎
数据的查询
def login(request):
if request.method=='POST':
# print(request.POST)
username=request.POST.get('username')
password=request.POST.get('password')
# print(username,type(username))
from app01 import models
# res是一个列表[数据对象1,数据对象2...],filter可以写多个参数,查询的时候默认是and关系
user_obj=models.User.objects.filter(username=username).first()
# select * from user where username='egon'
# user_obj=res[0]
# print(user_obj.username)
# print(user_obj.password)
if user_obj:
if user_obj.password==password:
return HttpResponse('登录成功')
else:
return HttpResponse('密码错误')
else:
return HttpResponse('用户名不存在')
# return HttpResponse('本来无一物,何处惹尘埃')
return render(request,'login.html')
数据的增加
def register(request):
if request.method=='POST':
username=request.POST.get('username')
password=request.POST.get('password')
from app01 import models
#方式一,返回的结果就是一条记录对象,
# user_obj=models.User.objects.create(username=username,password=password)
#方式二:类生成对象,返回的结果也是一条记录对象
user_obj=models.User(username=username,password=password)
user_obj.save()
print(user_obj.username,user_obj.password)
return render(request,'register.html')
数据的改和删
# 批量保存数据,只保存被改动的部分
models.User.objects.filter(id=edit_id).update(username=username, password=password)
# 未被改动的部分也会重写
# edit_obj.username = username
# edit_obj.password = password
# edit_obj.save()
后端不会真的删除数据,只是加一个字段来表示某条数据是否被删除过
删除数据的时候应该有一个二次确认的过程
orm创建表关系
from django.db import models
# Create your models here.
class Book(models.Model):
book_name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8, decimal_places=2)
# 出版社和图书是一对多的关系,书是多的一方,所以外键放在书表里面
publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
# author是一个虚拟字段,图书和作者是多对多关系,外键字段建在任意一方均可,推荐建在查询频率较高的一方
author = models.ManyToManyField(to='Author')
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=16)
age = models.IntegerField()
# 作者和作者信息是一对一关系,外键字段建在任意一方均可,推荐建在查询频率较高的一方
author_detail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
class AuthorDetail(models.Model):
phone = models.CharField(max_length=11)
addr = models.CharField(max_length=32)
设置外键和一对一关系级联更新,级联删除,需要添加参数:on_delete=models.CASCADE
浙公网安备 33010602011771号