django03 ORM

137 阅读3分钟

django orm介绍

  • 1.什么叫orm
    • orm: 对象关系映射
python被映射为数据库
对象记录
对象点熟悉字段对应的值
```
用于实现面向对象编程语言里不同类型系统的数据之间的转换
它其实是创建了一个可在 编程语言 里使用的“虚拟对象数据库”。         
通俗的来说:ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
```
  • 2.使用orm创建数据库
    • 1.先去应用目录下的model.py编写模型类
         # create table userinfo();
      class userinfo(models.Model):                 # 定义了表名
         # id int primary key auto_increment
         id = models.AutoField(primary_key=True)   # 相当于定义了主键自增
         # name varchar(32)
         name = models.CharField(max_length=32)    # 定义了普通字段
         # password int
         password = models.IntegerField()          # 定义了普通字段
         # 完整sql语句
            # create table userinfo(id int primary key auto_incremwnt,name varchar(32),password int)
         
      

我们通过orm写完sql语句后还需要将其同步到数据库中,所以需要执行指令进行迁移同步操作

  • 2.数据库迁移/同步命令
    1. 将models中有关数据库的操作记录下来(migration文件夹)
          python38 manage.py makemigrations
    2. 将操作影响到数据库
          python38 manage.py migrate
    * 只要models或数据库中的代码发生了变动,都需要执行上述操作命令
    
    * 可能出现的问题
      D:\pycharmProjects\housework_django>python38 manage.py makemigrations
      No changes detected
      解决方式:
      查看setting中的INSTALLED_APPS    app名字是否与自己创建的app一致
      python38 manage.py makemigrations appname
    
    • 偷懒行为(不建议)
     1.只敲关键字
     * 导航栏Tools>>>run manage.py Task
          makemigrations
          migrate
     2.也可以指定应用单独迁移/同步
         后面加上app名字就行
    
    • 如下图
      image.png
  • 3.表的主键在orm中,可以不写,orm会帮你自动添加一个id的主键
    • 自动创建的主键代码上会多auto_created=True,意思为自动创建
    在我们需要设置主键名不叫id的主键时就需要自己添加,不能让orm自己创建了
    

    orm语法

  • 1.在models.py外用orm需要导入
    from app01 import models
    
  • 2.增
    models.表名.objects.create()
    结果: userinfo object (2)
    
  • 3.查
    models.表名.objects.filter()
    结果: <QuerySet [<userinfo: userinfo object (1)>]> 列表套对象
    * 如何获取对象? 
    可以使用first()方法,不推荐使用索引,如果没有值会返回None,进行if判断即可.
    
  • 4.改
    models.表名.objects.filter(id=?).update(name='新名字',password='新密码')
    
  • 5.删
     models.表名.objects.filter(id=?).delete()
    
  • 6.实现得关键代码
    后端:
      from app01 import models
    
      def login(request):
          if request.method == 'POST':
              username = request.POST.get('username')
              password = request.POST.get('password')
              # 1.查
              # select * from userinfo where name='' and password=''
              res = models.userinfo.objects.filter(name=username, password=password).first()
              print(res)  # <QuerySet [<userinfo: userinfo object (1)>]> 列表套对象
              user_obj = res
              if user_obj:
                  print(user_obj.id)
                  print(user_obj.name)
                  print(user_obj.password)
                  return HttpResponse('登录成功')
              return HttpResponse('用户名或密码错误')
              # 2.增
              res = models.userinfo.objects.create(name=username,password=password)
              print(res)
              return HttpResponse('用户新增成功')
              # 3.改
              models.userinfo.objects.filter(id=2).update(name='hanser',password='666')
              return HttpResponse('用户信息已修改')
              # 4.删
              models.userinfo.objects.filter(id=1).delete()
              return HttpResponse('该用户已删除')
          return render(request, 'my01.html')
    
    前端:
       <div class="container">
           <div class="row">
               <h1 class="text-center">用户登录</h1>
               <div class="col-md-6 col-md-offset-3">
                   <form action="" method="post">
                       <p>username:<input type="text" name="username" class="form-control"></p>
                       <p>password:<input type="text" name="password" class="form-control"></p>
                       <input type="submit" value="登录" class="btn btn-success btn-block">
                   </form>
                   
               </div>
           </div>
      </div>
    

orm外键关联

  • 1.mysql中判断表关系
    MySQL
      一对多         外键字段建在多的一方
      多对多         外键字段建在第三张关系表
      一对一         外键字段建在查询频率较高的表中
    
  • 2.orm中建外键

我们以下四张表作为例子:出版社表(Publish),书籍表(Book),作者表(Authors),作者详细表(AuthorDetail)

  • 1.一对多
    外键字段建在多的一方    # 一个出版社可以出版多本数(一对多)
    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    
  • 2.多对多
    外键字段可以直接写在某张表中 orm会自动帮你创建第三张表
       # 一本书可以由多个作者编写,一个作者也可以写多本书(多对多)
    author = models.ManyToManyField(to='Authors')
    
  • 3.一对一
    外键字段建在查询频率较高的表中   # 作者与作者详情(一对一)   
    authors_message = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
    
  • 4.一些关键字的意思
    on_delete=models.CASCADE     级联删除
    OneToOneField                一对一
    ManyToManyField              多对多
    ForeignKey                   一对多
    
  • 5.代码实例
    from django.db import models
    class Book(models.Model):
        title = models.CharField(max_length=32)
        # 一个出版社可以出版多本数    一对多
        publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
        # 一本书可以由多个作者编写,一个作者也可以写多本书(多对多)
        author = models.ManyToManyField(to='Authors')
    
    class Publish(models.Model):
        publish_name =models.CharField(max_length=32)
    
    class Authors(models.Model):
        name = models.CharField(max_length=32)
        # 作者与作者详情(一对一)
        authors_message = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
    
    class AuthorDetail(models.Model):
     ations   authors_message =models.BigIntegerField()