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所在的文件夹,再执行

可以在命令行里面执行

  1. python8 manage.py makemigrations

    将操作记录到migrations文件夹中。类似于日志

  2. python8 manage.py migrate

    将操作真正的同步到数据库中

只要在models.py中修改了与数据库相关的代码,就要执行上面两条命令

还可以在pycharm里面

  1. tools菜单——Run manage.py task 命令
  2. 然后在命令行只需要输入: 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