6.模型基础

  1. 数据库的连接配置
    django 连接mysql的配置流程:
  • 安装 pymysql pip install pymysql
  • 创建数据库用户
    创建拥有数据库权限的用户 -- root
  • 创建数据库
create database text;
  • 修改配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'text',
        'USER': 'root',
        'PASSWORD': 'qwe123',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
  • 修改项目文件夹(和settings.py文件所在的目录)下init.py 文件写上:
    import pymysql
    pymysql.install_as_MySQLdb()
  • 设置时区
TIME_ZONE = 'Asia/Shanghai' # 北京时间
  1. django的ORM系统
  • 对象关系映射(Object Relational Mapping,简称ORM)!
    简单的说就是用面向对象的方式,描述数据库,操作数据库,达到不用编写SQL语句就能对数据库进行增删改查。
  1. 模型的创建与激活
  • 创建模型
    创建Student模型,即创建一个类
from django.db import models


class Student(models.Model):
    name = models.CharField(max_length=20)
    age = models.SmallIntegerField(default=0)
    sex = models.SmallIntegerField(default=1)
    # CharField 最后不要设置 null=True
    qq = models.CharField(max_length=20, default='')
    phone = models.CharField(max_length=20, default='')
    # auto_now_add=True在创建对象时自动将当前时间(国际时间UTC)保存,显示时会自动转为本区时间
    # verbose_name 指定可读的名称
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
  • 总结:
    1. 每一个模型都是django.db.models.Model的子类(模型对表)
    2. 类变量 表示模型中的数据库字段(类变量对字段)
    3. 每一个字段由一个字段类的实例表示
  • 激活模型
    1. 在项目中注册app -- INSTALLED_APPS = [ ]
    2. 运行数据库迁移命令(一定要在项目根目录下)
      makemigrations app
    3. 运行migrate命令,使迁移生效
      migrate app
  • 表名 app(name)_模型名(name.lower)
  1. 数据的增删改查
    • 工具 djang shell 调试工具
      python manage.py shell

    • 3种方法
(Dream) pyvip@vip:~/Test$ python manage.py shell
Python 3.6.5 (default, Apr  1 2018, 05:46:30) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
# 从app导入Student 数据库模型
>>> from index.models import Student
# Student 管理器(自动创建)
>>> Student.objects

# 查询所有值,返回查询集
>>> Student.objects.all()

# --------------添加数据方式一--------------------#
>>> s1 = Student()
>>> s1.name = '梦杰'
>>> s1.age = 1
>>> s1.qq = '123456'
# 必须要使用save方法,才可在数据库增加数据
>>> s1.save()
>>> Student.objects.all()
]>
from django.db import models

# --------------增设查询名显示优化--------------------#
class Student(models.Model):
    name = models.CharField(max_length=20)
    age = models.SmallIntegerField(default=0)
    sex = models.SmallIntegerField(default=1)
    qq = models.CharField(max_length=20, default='')
    phone = models.CharField(max_length=20, default='')
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    def __str__(self):
        return "{}-{}".format(self.name, self.age)

>>> from index.models import Student
>>> Student.objects.all()
]>

# --------------添加数据方式二--------------------#
>>> Student.objects.create(name='魏刚',age=15)

>>> Student.objects.all()
, ]>

# --------------添加数据方式三--------------------#
>>> Student.objects.get_or_create(name='心蓝',age=18)
# 创建的为True
(, True)
# 查询的为False
>>> Student.objects.get_or_create(name='梦杰',age=1)
(, False)

  • 3种方法
#---------------------------all查询,返回查询集,不会进行数据库查询----------------------------#
>>> res = Student.objects.all()
>>> print(res)
, , , , ]>
>>> print(res.query)
SELECT `index_student`.`id`, `index_student`.`name`, `index_student`.`age`, `index_student`.`sex`, `index_student`.`qq`, `index_student`.`phone`, `index_student`.`create_time` FROM `index_student`

        #-----------------------可以切片操作------------------#
>>> res[1:2]
]>
>>> res[1:2].query

>>> print(res[1:2].query)
SELECT `index_student`.`id`, `index_student`.`name`, `index_student`.`age`, `index_student`.`sex`, `index_student`.`qq`, `index_student`.`phone`, `index_student`.`create_time` FROM `index_student`  LIMIT 1 OFFSET 1

#---------------------------filter查询,返回查询集,不会进行数据库查询----------------------------#
>>> Student.objects.filter(name='心蓝')
]>
>>> print(res.query)
SELECT `index_student`.`id`, `index_student`.`name`, `index_student`.`age`, `index_student`.`sex`, `index_student`.`qq`, `index_student`.`phone`, `index_student`.`create_time` FROM `index_student` WHERE `index_student`.`name` = 心蓝


#----------------------------get查询,返回数据,直接对数据库进行查询-----------------------------#
>>> Student.objects.get(name='心蓝')



  • 2种方法
#----------------------------get查询条修改 save保存-----------------------------#
>>> s= Student.objects.get(name='心蓝')
>>> s.age
18
>>> s.phone
''
>>> s.age = 16
>>> s.phone = '123456789'
>>> s.save()
>>> Student.objects.get(name='心蓝').age
16
>>> Student.objects.get(name='心蓝').phone
'123456789'
>>> 
#----------------------------filter查询批量修改-----------------------------#
>>> Student.objects.filter(name='心蓝').update(age=19)
1
>>> Student.objects.get(name='心蓝').age
19

  • 2种方法
#----------------------------get查询单个删除-----------------------------#
>>> s = Student.objects.get(name='心蓝')
>>> s

>>> s.delete()
(1, {'index.Student': 1})

#----------------------------filter查询批量删除-----------------------------#
>>> Student.objects.filter(sex=1).delete()
(4, {'index.Student': 4})
>>> Student.objects.all()


  • 案例
>>> Student.objects.get_or_create(name='liuwei',sex=1,age=18)
(, True)

#----------------------------views.py------------------------------#
from django.views import View
from django.shortcuts import render
from .models import Student

class Index(View):


    def get(self, request):

        students = Student.objects.all()
        return render(request, 'index/home.html', context={
            'students': students,
        })

#----------------------------home.html------------------------------#

              {% for student in students %}
                
                {{ forloop.counter }}
                {{ student.name }}
                {{ student.age|add:1 }}
                {{ student.sex|to_male:'en'}}
                
              {% endfor %}


6.模型基础_第1张图片
eg.png

你可能感兴趣的:(6.模型基础)