Django(6) - 模型基础

154 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第35天,点击查看活动详情

六,模型基础


一,数据库连接配置


1),安装

​ 安转pymysql,进入到对应的虚拟环境pip install pymysql

​ 2),创建:创建数据库
  1. 创建数据库用户[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tfMlgn8v-1592067473104)(assets/1.png)]

  2. 创建库:create database 库名;

  3. 配置:在setting中配置mysql

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'CRM',			# 数据库名(Mysql里创建的)
            'USER': 'root',			# 用户名
            'PASSWORD': 'qwe123',	# 密码
            'HOST': '127.0.0.1',	# IP
            'PORT': '3306'			# 端口(虚拟机别忘记端口转发)
        }
    }
    
  4. 导入:在根目录下的__init__.py文件下导入pymysql

    import pymysql
    
    pymysql.install_as_MySQLdb()
    

二,Django的ORM简介


​ ORM:对象关系映射(Object Relational Mapping)简单来说,就会用面向对象的方式,达到不用编写Sql语句就能对数据库进行操作(描述数据库,增删改查数据库)

​ 数据库 --------> Django

​ 表 ---------> 类

​ 字段 --------> 类属性

​ 一行数据 --------> 一个实例

三,模型的创建和映射


1),创建模型

​ 在对应的App下的models.py创建模型(类)

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=20)  # 创建varchar的类
    age = models.SmallIntegerField()        # 创建tinyint字段的类
    sex = models.SmallIntegerField(default=1)   # 设置默认值
    qq = models.CharField(max_length=20)
    phone = models.CharField(max_length=20)
    cre_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    # verbose_name可以设置成一个人类认识的字段名,auto_now_add自动填充当前时间
​ 2),激活模型
  1. 注册:在项目的setting.py中注册App

    还有一种写法是[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIU5ZSZf-1592067473110)(assets/2.png)]

  2. 迁移(未生效):

    python manage.py makemigrations 全部模型都迁移

    ​ 作用:告诉Django,我们做了哪些数据库的更改

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxC0ZC06-1592067473116)(assets/4.png)]

    python manage.py makemigrations app名 指定App下的模型迁移

    迁移:是django对模型的更改方式,它是一个文件,把我们设置的文件保存下来了,但是在数据库里面还没生效还没生效

    python manage.py sqlmigrate student 0001 查看原生sql语句[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LCvNl37g-1592067473119)(assets/3.png)]

  3. 迁移生效

    运行migrate命令,使迁移生效:python manage.py migrate或者 python manage.py migrate student

    表名:appname_模型名

    3),总结
    1. 更改模型(App下的models.py有修改)
    2. 生成迁移:python manage.py makemigrations
    3. 迁移生效:python manage.py migrate

四,数据库的增删改查


准备工作:

  1. 进入虚拟环境安转:pip install ipython

  2. 进入django shell调试工具:python manage.py shell

  3. 常用的三个操作(导入模型,查看对象,查看数据)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvXsQypj-1592067473121)(assets/5.png)]

    1. 第一种创建方法(变量)

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmGFJIcg-1592067473125)(assets/6.png)]

    2. 第二种创建方法(类实例)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ToGXh8cr-1592067473126)(assets/7.png)]

    3. 第三种创建方法(create方法,不需要save)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbXxNAW8-1592067473130)(assets/8.png)]

    4. 第四种创建方法(先查,如果没有创建,返回True)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJjtvFjR-1592067473134)(assets/9.png)]

  4. 查(all,get,flilter)

    1. 查询全部(all)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xgfbLWIs-1592067473141)(assets/10.png)]
    2. 指定查询,单个(get)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jAcZ5GfK-1592067473147)(assets/11.png)]
    3. 条件查询,多个(filter)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcFjx6Mg-1592067473149)(assets/12.png)]
  5. 删(delete)

    1. 删除单个[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3VrQGatO-1592067473152)(assets/13.png)]
    2. 删除多个[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9wiEsQfN-1592067473154)(assets/14.png)]
    3. 删除所有[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXSYl2pG-1592067473157)(assets/15-1558078353845.png)]
    1. 修改一条[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LD9cjA8S-1592067473159)(assets/16.png)]
    2. 修改多条[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8rwoIxd-1592067473163)(assets/17.png)]

五,在模板里面使用数据库数据


1,视图文件设置(views.py)
from student.models import Imforation
data = Imforation.objects.all()
context={'data': data}
2,模板设置(html文件)
<tr>
    <th>序号</th>
    <th>姓名</th>
    <th>年龄</th>
    <th>性别</th>
    <th>qq</th>
    <th>时间</th>
</tr>

{% for aaa in data %}
     <tr>
        <td>{{ forloop.counter }}</td>
        <td><a href="{% url 'student:detail' aaa.name %}">{{ aaa.name }}</a></td>
        <td>{{ aaa.age }}</td>
        <td>{{ aaa.sex|to_sex:'zh' }}</td>
        <td>{{ aaa.qq }}</td>
        <td>{{ aaa.cre_time }}</td>
    </tr>
		{% endfor %}
        <td>{{ aaa.age }}</td>
        <td>{{ aaa.sex|to_sex:'zh' }}</td>
        <td>{{ aaa.qq }}</td>
        <td>{{ aaa.cre_time }}</td>
    </tr>
{% endfor %}