08 django模型系统(一)

课前补充:1.虚拟环境的账号不要用root账号链接虚拟机

1.数据库的连接配置
django 连接mysql的配置流程:
- 进入虚拟环境,安装mysql

pymysql pip install pymysql

- 创建数据库用户

有创建数据库权限的用户

例如:创建一个管理员用户crm账号,密码为crm@python

CREATE USER ‘crm‘@‘%‘IDENTIFIED BY ‘crm@python‘;

给这个用户授予所有远程访问,这个用户主要用于管理整个数据库,备份,还原等操作。

GRANT ALL ON *.* TO ‘crm‘@‘%‘; 

使授权立即生效:

 FLUSH PRIVILEGES;

- 创建数据库crm

create database crm;

- 修改配置
settings.py(我连接使用的是root用户,用什么用户能连接上就行)

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,  #引擎
        ‘NAME‘: ‘crm‘,
        ‘USER‘: ‘root‘,
        ‘PASSWORD‘: ‘qwe123‘,
        ‘HOST‘: ‘127.0.0.1‘,
        ‘PORT‘: ‘3306‘,
    }
}

- 修改项目文件夹(和settings.py文件所在的目录)下
__init__.py 文件(如果导入不行,先退出pycharm项目,重新进入)

import pymysql
pymysql.install_as_MySQLdb()

settings.py设置时区

TIME_ZONE = ‘Asia/Shanghai‘ # 北京时间

2.django的ORM系统

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

3.模型的创建与激活
创建模型
Student的模型,代表学生

from django.db import models
# Create your models here.

class Student(models.Model):  #继承自Modle  模型会自动创建主键
    name = models.CharField(max_length=20)   #姓名  字符字段(CharField)  必须参数 max_length
    age = models.SmallIntegerField(default=0)  #年龄  SmallInterField default(默认值)
    sex = models.SmallIntegerField(default=1)   #性别
    qq = models.CharField(max_length=20,unique=True,null=True)
    phone = models.CharField(max_length=20,unique=True,null=True)
    #删除年级的时候不必把学生都删除,必须可以设置年级字段为null,on_delete=models.SET_NULL,null=True
    grade = models.ForeignKey(‘Grade‘,on_delete=models.SET_NULL,null=True)
    c_time = models.DateTimeField(verbose_name=‘创建时间‘,auto_now_add=True)  #时间日期型,verbose_name提示信息,如果有这个参数必须写在第一个参数位置
    e_time = models.DateTimeField(verbose_name=‘编辑时间‘,auto_now=True)  #auto_now_add创建对象额时候讲当前时间记录到数据库 auto_now每次更新都会将时间更新
    is_deleted = models.BooleanField(default=False)
    def __str__(self):    #输出友好,重写__str__方法,添加这一段对数据库不造成任何影响,不用做数据库迁移
        return ‘%s-%s-%s‘ %(self.id,self.name,self.age)

总结:
1. 每一个模型都是django.db.models.Model的子类
2. 类变量 表示模型中的数据库字段
3. 每一个字段由一个字段类的实例表示
激活模型
1.在项目中注册app,在settings.py

INSTALLED_APPS = [
    ‘teacher‘,  #添加项目名称到INSTALLED_APPS中
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
]

2.运行数据库迁移命令(一定要在项目根目录下)

python mange.py makemigrations teacher  #可以不加teacher,如果不加会把INSTALLED_APPS中所有的app都做更改

告诉django,我们做了哪些数据库的更改

sqlmigrate 从迁移获取sql语句,生成的数据库迁移文件

python manage.py sqlmigrate teacher 000(模糊匹配)
-- Create model Student   #(与上面的定义略有不同,只为展示上面命令的结果)
--
CREATE TABLE `teacher_student` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` varchar(20) NOT NULL,
`age` smallint NOT NULL,
`sex` smallint NOT NULL,
`qq` varchar(20) NOT NULL,
`phone` varchar(20) NOT NULL,
`c_time` datetime(6) NOT NULL);
COMMIT;

# 表名 appname_模型name.lower

3.运行migrate命令,使迁移生效

python manage.py migrate  #(执行后,在数据库里能够查到表)

#对于数据库模型中的修改都要先运行数据库迁移命令python mange.py makemigrations,并且使迁移生效python manage.py migrate

4.数据的增删改查
-工具 djang shell 调试工具

需要安装ipython

pip install ipython

进入调试工具,如下

pyvip@Vip:~$ workon django
(django) pyvip@Vip:~$ cd crm/
(django) pyvip@Vip:~/crm$ ls
crm  db.sqlite3  demo.py  manage.py  static  student  teacher  templates  upload
(django) pyvip@Vip:~/crm$ python manage.py  shell
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
Type ‘copyright‘, ‘credits‘ or ‘license‘ for more information
IPython 7.3.0 -- An enhanced Interactive Python. Type ‘?‘ for help.

In [1]:       

数据增加,查询

In [1]: from teacher.models import Student             #从模型中导入数据库                                                            

In [2]: Student.objects                        #objects是Student模型类的管理器
Out[2]: <django.db.models.manager.Manager at 0xb47e7c4c>

In [3]: Student.objects.all()
Out[3]: <QuerySet []>  #返回查询集QuerySet
    - 增
    4种方法
1.实例化一个对象
In [7]: s1 = Student(name = ‘aaa‘,age=19,qq=‘1234‘)                                                               

In [8]: s.save()    #只有调用save()方法后才能保存到数据库
In [10]: Student.objects.all()
Out[10]: <QuerySet [<Student: Student object (1)>]>
2.创建一个空的实例对象,再通过添加对象属性
In [11]: s2= Student()                                                                                            

In [12]: s2.name =‘xinlan‘                                                                                        

In [13]: s2.age = 18                                                                                              

In [14]: s2.qq = ‘12312‘
In [15]: s2.save()    #只有调用save()方法后才能保存到数据库
3.一步创建数据,直接操作数据
In [11]: Student.objects.create(name=‘xiaopo‘,age=16)
Out[11]: <Student: xiaopo-16>
4.通过get_or_create方法创建对象(先查,如果没有再创建)

False代表是查来的,True 是创建来的
In [14]: Student.objects.get_or_create(name=‘xiaopo‘,age=16)
Out[14]: (<Student: xiaopo-16>, False)  #返回一个元组,第一个值是一个模型对象

In [15]: s=Student.objects.get_or_create(name=‘shiwei‘,age=16)
In [16]: s

Out [16]:(<Student: shiwei-16>, True)

In [17]:s[0].name

Out [17]:‘shiwei‘

In [18]:s[0].age

Out [18]:‘16‘

- 查询
In [2]: from teacher.models import Student
#查询所有
In [3]: Student.objects.all() #返回的查询集可以for循环,可以迭代,可以切片
Out[3]: <QuerySet [<Student: aaa-19>, <Student: xinlan-18>]>
#查询一条
#使用get不能查询出多条,会报错,最好使用(id)主键
In [4]: s = Student.objects.get(id=1)  #返回的是对象,不是查询集
#表里面的主键不一定会取名加id,最好写成pk,不管主键是什么,都可以查到
In [4]: s = Student.objects.get(pk=1)

In [5]: s 
Out[5]: <Student: aaa-19>

#filter过滤
In [23]: res = Student.objects.filter(sex=1)

In [24]: print(res.query) #打印SQL如下
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student` WHERE `teacher_student`.`sex` = 1
In [25]: res
Out[25]: <QuerySet [<Student: aaa-19>, <Student: xinlan-18>, <Student: xiaopo-16>, <Student: shiwei-16>]>

2.
In [18]: res=Student.objects.all()

In [19]: print(res.query)
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student`
可以迭代、切片
In [21]: print(res[1:3].query)
SELECT `teacher_student`.`id`, `teacher_student`.`name`, `teacher_student`.`age`, `teacher_student`.`sex`, `teacher_student`.`qq`, `teacher_student`.`phone`, `teacher_student`.`c_time` FROM `teacher_student` LIMIT 2 OFFSET 1

3.修改,通过对对象数据进行赋值,修改属性
In [27]: s2 = Student.objects.get(id=4)
In [30]: s2.age
Out[30]: 16

In [31]: s2.age=22

In [32]: s2.save()
In [34]: Student.objects.get(name=‘shiwei‘).age
Out[34]: 22
通过update修改
In [35]: Student.objects.filter(name=‘shiwei‘).update(age=18) #匹配出来的数据全部改成18
Out[35]: 1
In [37]: Student.objects.get(name=‘shiwei‘).age
Out[37]: 18
4.删除

1.
In [38]: s= Student.objects.get(name=‘shiwei‘)

In [39]: s.delete()
Out[39]: (1, {‘teacher.Student‘: 1})

2.

In [41]: Student.objects.filter(sex=1).delete()
Out[41]: (3, {‘teacher.Student‘: 3})

In [43]: Student.objects.all()
Out[43]: <QuerySet []>

通过在创建数据库Students模块

from teacher.models import Student,Grade,StudentDetail,Course,Enroll

def index(request):
    students = Student.objects.all()
    format_str = ‘%Y-%m-%d %H:%M:%S‘
    return  render(request,‘teacher/index.html‘,context={
        ‘student‘:students,
        ‘format_str‘:format_str
    })

原文地址:https://www.cnblogs.com/taoge188/p/10503901.html

时间: 2024-11-06 03:29:51

08 django模型系统(一)的相关文章

Django模型系统(一)

装饰器补充 django模型系统 一,数据库的链接配置 二,Django的ORM简介 三,模型的创建与激活 四,数据的增删改查 一,数据库的链接配置 django  链接mysql的配置流程: -安装pymysql --   pip  install  pymysql -创建数据库用户 -有创建数据库权限的用户 -创建数据库 create database mysite; (创建需要的数据库) -修改配置 -修改项目文件(和settings.py文件所在的目录)下 __init__.py文件 -

django模型系统(二)

django模型系统(二) 常用查询 每一个django模型类,都有一个默认的管理器,objects QuerySet表示数据库中对象的列表.他可以有0到国歌过滤器.过滤器通过给定参数,缩小查询范围(filter). QuerySet等同与select语句,过滤器等同于一个限制字句,比如where.limit 使用.query可查看对应的SQL语句 all()获取所有 name.objects.all()queryset 获取第一条 name.objects.first()返回的是对象 获取最后

django模型系统二

常用查询及表关系的实现 1.常用查询 每一个django模型类,都有一个默认的管理器 objects QuerySet表示数据库中对象的列表,它可以有0到多个过滤器.过滤器通过给定参数,缩小查询范围. QuerySet等同于select语句,过滤器是一个限制子句,比如where,limit. all() 获取所有 Student.objects.all() #返回的是queryset 获取第一条 Student.objects.first() #返回的是对象 获取最后一条 Student.obj

Django 模型系统(model)&amp;ORM--进阶

QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. >>> Entry.objects.all()[:5] # (LIMIT 5) >>> Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5) 不支持负的索引(例如Entry.objects.all()[-1]).通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询. 可迭代 articleL

B django模型系统(后续1)

1.数据库的链接配置 django里mysql的连接流程 安装--pip install  pymysql 创建数据库用户 有创建数据库的权限的用户 创建数据库 crm 修改配置  setings DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'crm', 'USER':'root', 'PASSWORD':'qwe123', 'HOST':'127.0.0.1', 'PORT':'3306',

Django 模型系统(model)&amp;ORM--基础

ORM 映射关系: 类 ---> 表 属性 ---> 字段 对象 --->一条数据 创建表(建立模型) 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(one-to-one) 出版商模型:出版商有名称,所在城市以及email. 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系

django模型系统(三)--多对多,一对一以及跨表查询

-Many-to-Many*** 指定了中间表,add,remove,set 都不能用,必须用中间表 两端都可以自动获得另一端的自动API访问.跟一对多的反向访问类似.但是使用的是本字段的字段名 In [112]: Course.objects.create(name='python全栈') Out[112]: <Course: python全栈> In [113]: Course.objects.create(name='python全套') Out[113]: <Course: py

Django模型

数据库表的设计 设计系统表 Django提供完善的模型(model)层主要用来创建和存取数据,不需要我们直接对数据库操作. Django模型基础知识:每个模型是一个Python类,继承django.db.models.model类.该模型的每个属性表示一个数据库表字段.所有这一切,已经给你一个自动生成的数据库访问的API. 1.打开.../sign/models.py文件,完成表的创建 from django.db import models # Create your models here.

django认证系统

Django认证系统同时处理认证和授权.简单地讲,认证验证一个用户是否它们声称的那个人,授权决定一个通过了认证的用户被允许做什么.这里的词语"认证"同时指代这两项任务. 认证系统包含: 用户 权限:二元(是/否)标志指示一个用户是否可以做一个特定的任务. 组:对多个用户运用标签和权限的一种通用的方式. 一个可配置的密码哈希系统 用于登录用户或限制内容的表单和视图 一个可插拔的后台系统 使用: 位于django.contrib.auth,配置在settings.py中的 INSTALLE