zoukankan      html  css  js  c++  java
  • Django(三) ORM操作

    一、DjangoORM 创建基本类型及生成数据库表结构

    1、简介

      ORM:关系对象映射。定义一个类自动生成数据库的表结构。

      数据库常用的数据类型 :

      1. 数字
      2. 字符串
      3. 时间

           ORM分为两种类型: 主流都是code first

      • code first:先写代码,执行代码创建数据库表结构
      • DB    first:据库里先创建数据库表结构,根据表结构生成类,根据类操作数据库

      Django也是code first。其本质:

      1. 根据类自动创建数据库表

          2.根据类对数据库中的表进行各种操作

    2、创建数据库 表结构

      2.1 先写类

    1 from django.db import models
    2 
    3 class UserInfo(models.Model):  # 必须继承models.Model
    4     # 不写则,django默认创建ID列,自增,主键
    5     # 用户名列,字符串类型,指定长度
    6     username = models.CharField(max_length=32)
    7     password = models.CharField(max_length=64)

      2.2 注册app

        

       执行命令python manage.py makemigrations,会提示No changes detected

          这是因为:执行命令时会找所有models,但是django不知道找哪个,所有需要指定一下。

        在配置文件setting中

    1 INSTALLED_APPS = [
    2     'django.contrib.admin',
    3     'django.contrib.auth',
    4     'django.contrib.contenttypes',
    5     'django.contrib.sessions',
    6     'django.contrib.messages',
    7     'django.contrib.staticfiles',
    8     'app01',            # 这里添加app
    9 ]

      2.3执行命令生成表结构

    1 python manage.py  makemigrations    # 生成migrations临时文件
    2 python manage.py  migrate           # 根据migrations直接生成数据库

      执行后,从migrations便会产生操作记录。生成数据库,默认情况下用的sqlite3。可以用navicat等软件直接打开。

      db.sqlite3里面包含缓存、session、cookie、静态文件以及后台管理。像咱们创建的表名叫:app01_userinfo

      2.4、连接mysql数据库

        Django默认使用的是sqllite,如果想使用mysql数据库。代码不用改、命令也不用改,只需要改下配置文件。

    # https://docs.djangoproject.com/en/1.10/ref/settings/#databases  官网文档
    # DATABASES = {             # sqlite 默认
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    DATABASES = {               # mysql
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mydatabase',
            'USER': 'mydatabaseuser',
            'PASSWORD': 'mypassword',
            'HOST': '127.0.0.1',
            'PORT': '3306',
        }
    }

    注意:

      1.Django在使用mysql的时候,不能帮我们创建数据库,所以我们要自己去创建

      2.Django默认使用MySQLdb模块链接MySQL,但是在py3中还没有MySql模块,所以我们要使用PyMysql。

        在project项目名下的__init__.py里面

    1 import pymysql
    2 pymysql.install_as_MySQLdb()

     二、Django ORM基本的增删改查

     1 from cmdb import models #先到app中把models导入,下面可使用我们的类
     2 def orm(request):
     3 *****创建的三种方法,推荐使用第一种
     4     # models.User_info.objects.create(username='aelex',password='123')

    5 # dic = {'username':'lh','password':'231'} 6 # models.User_info.objects.create(**dic)

    7 # obj = models.User_info(username='aelex',password='231') 8 # obj.save() 9 ***********基本的查数据:得到的数据是一个对象结合 10 #v=models.User_info.objects.all()      #得到的是QuerySet对象,并且有多个元素,类似列表,可以进行for循环 11 #v = models.User_info.objects.filter(id=1) #filter 相当于 sql中的where 12 # v = models.User_info.objects.filter(username='lh', password='231')# 使用,拼接and的作用 13 # for row in v: 14 # print(row.id, row.username, row.password) #每个元素都是我们在定义数据库的时候的值 15 *******************删除操作 16 # models.User_info.objects.filter(id=1).delete() #先得到对象,在使用dellete方法删除 17 ******************更新操作 18 models.User_info.objects.all().update(password='888') 19 return render(request, 'orm.html')

     多对多关系

    方式1:手动创建

     1 class host(models.Model):
     2     #db_index 是创建索引,加快搜索
     3     id = models.AutoField(primary_key=True)
     4     hostname = models.CharField(max_length=32,db_index=True)
     5     ip = models.GenericIPAddressField(db_index=True,protocol='both')
     6     port = models.IntegerField()
     7     b = models.ForeignKey('Busniess',to_field='id')
     8     #b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id
     9     #视图函数中操作b是一个链表操作。
    10 
    11 class Application(models.Model):
    12     name = models.CharField(max_length=21)
    13 
    14 class HostToApp(models.Model):
    15     hobj = models.ForeignKey(to="host", to_field="id")
    16     aobj = models.ForeignKey(to="Application",to_field="id")

    方式2:系统自动创建

    创建了一张新表,自动关联两者的主键。

     1 class host(models.Model):
     2     #db_index 是创建索引,加快搜索
     3     id = models.AutoField(primary_key=True)
     4     hostname = models.CharField(max_length=32,db_index=True)
     5     ip = models.GenericIPAddressField(db_index=True,protocol='both')
     6     port = models.IntegerField()
     7     b = models.ForeignKey('Busniess',to_field='id')
     8     #b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id
     9     #视图函数中操作b是一个链表操作。
    10 
    11 class Application(models.Model):
    12     name = models.CharField(max_length=21)
    13     r = models.ManyToManyField(to="host")

    手动创建:可以自定义列,使用类操作数据库来使用。

    自动创建:只能创建三列(id,两张表的主键)。看不到这个类,所以无法直接对表进行操作。

          间接操作:

           obj=models.Application.obj.get(id=1) #得到一列,里面有name与r(是一个对象)
    
           obj.r.add(1)
    
           obj.r.add(1,2,3)
    
           obj.r.add(*[1,2,3])
    
           obj.r.remove(1)   存在上面三种方式
    
           obj.r.clear()    情况所有的对应
    
           obj.r.set(1,2,3)  类似重置的功能,删除所有的对应,新建1-1 1-2 1-3
  • 相关阅读:
    android xml解析添加到listview中的问题
    jquery重写一个对话框
    linq join多字段
    asp.net添加验证码
    基本知识点罗列
    wordpress添加文章浏览统计(刷新不重复)
    vue使用SockJS实现webSocket通信
    el-table的多选框表头增加全选字样
    js如何在一个日期上面加上几小时 几分钟 几秒
    高德地图-Vue-amap实现POI搜索+自定义点
  • 原文地址:https://www.cnblogs.com/louhui/p/8088006.html
Copyright ? 2011-2022 开发猿


http://www.vxiaotou.com