django模型1

django支持各种主流的数据库,项目根目录中的db.sqlite就是数据库文件,默认情况下django配置的就是这个文件,它是个文件类型的数据库,比较小
一.数据库的连接配置
    django 连接mysql的配置流程:
     (1) 安装 pymysql:   pip install pymysql
     (2)创建数据库用户   这里需要有创建数据库权限的用户!
        1)可以使用navicat管理mysql数据库
        2)一般项目会有数据库人员负责,这里练习我们使用root账户进入mysql然后创建一个有创建数据库权限的用户:
            (1)输入命令,首先远程连接SSH,mysql -uroot -pqwe123;进入mysql
            (2)创建新用户:mysql> create user  zx_root   IDENTIFIED by 'xxxxx';   //identified by 会将纯文本密码加密作为散列值存储
                zx_root是用户名,'xxxxx'是密码,用户名和密码可以替换为我们自己的内容,密码要用引号括起来,
                ****注意mysql语句后面要有;才能结束
            (3)给权限:mysql> grant all on *.*  to zx_root;
            (4)查看用户权限:mysql> show grants for zx_root;
            (5)使授权立即生效:FLUSH PRIVILEGES;

    (3)创建数据库crm
        create database crm;    
    (4) 修改配置
        项目文件夹里的settings下的DATABASES,default里的'ENGINE'(引擎)的值,把backends(后端).后面的sqlite3改成mysql
                                        把  'NAME'的值改为'crm'
                                             增加键值对'USER':'root',      ----如果上面创建好了有创建数据库权限的用户,则输入该用户的名字
                                              增加键值对'PASSWORD':'qwe123',        --------如果使用创建的用户,填入该用户的密码
                                              增加键值对'HOST':'127.0.0.1',
                                              增加键值对'PORT':'3306',    #这里用字符串或者数字都可以,最好字符串
    
    (5)修改项目文件夹(settings.py文件所在的目录)下__init__.py 文件写上:
        import pymysql    #如果环境中新装的pymysql导入不了。close project一下重新进入
            pymysql.install_as_MySQLdb()    #历史原因,因为python2的时候用的MySQLdb,所以要加这个
    (6)设置时区 还是在settings.py里 TIME_ZONE = 'Asia/ShangHai' # 北京时间

二.django的ORM系统
    -对象关系映射(Object Relational Mapping,简称ORM)!
    底层还是执行的SQL,必须通过SQL才能操作数据库,只是写代码这一层看不到
    简单的说就是用面向对象的方式,描述数据库,操作数据库,
    达到不用编写SQL语句就能对数据库进行增删改查。
    映射关系:
    模型类对应数据表,类属性对应表字段名,类的实例对应表中的一条数据
    模型类必须写在app下的models.py文件中,模型如果需要映射到数据库,所在的app必须被安装
    

三.模型的创建与激活
    1.创建模型:(1)teacher这个app文件夹中的models.py中,创建类 class Student(models.Model)    --必须继承models.Model
        Student的模型,代表学生
        (2)创建字段名(类变量,类属性):1)name = models.CharField(max_length=)  
                 ---CharField本身也是一个类,他有一个必备参数max_length,相当于sql中varchar的长度
                           2)age = models.SmallIntegerField(default=0)  
                ---默认值default也可以不给,
                           3)qq = models.CharField(max_length=20,default='')
                ---CharField 最好不要让他None,可以给个空字符串做默认值
                ---一般数据库中qq,电话号码这些用字符串而不是int类型,操作方便
                           4)c_time = models.DateTimeField(verbose_name='创建时间')
                ---创建时间字段,verbose_name参数是提示信息,是给人看的,人类可读的名称
                可以是位置参数,放第一个,也可以是关键字参数
                还可以加一个参数auto_now_add=True,这样就不需要手动输入时间了,django自动帮我们处理,
                    保存当前对象的时候就会自动填入当前时间
                         5)id 一般省略就行了,不用我们手动添加,
                    如果模型类中我们没有定义主键,模型类会自动帮我们加了一个如下的id类属性
                    id = models.IntegerField(primary_key=True,auto_created=True)
                    创建的所有模型类实例都自动给个这个属性
        总结:
        1. 每一个模型都是django.db.models.Model的子类
        2. 类变量 表示模型中的数据库字段
        3. 每一个字段由一个字段类的实例表示
        注意:
        (1)每个变量名也就是数据库中表的列名,要机器友好,即用ASSIIC码中的字符,不要用中文,不要用数字,不要_开头,数字开头
        (2)字段名中verbose_name参数一般都在第一个位置参数,指定人类可读的名称,如果定义时没有加这个参数,则直接使用字段名
        (3)CharField字段必须提供max_length参数,他是必须参数,不光对数据模型起作用,也对数据库起作用,还对校验起作用(Form表单中会看到)
        (4)字段还有很多可选参数,比如default,它对应数据库中的默认值
    2.激活模型:有了以上创建的模型,django会为这个应用程序创建一个数据库模式,
        也就是先会创建表,生成SQL语句,根据上面的模型类创建去访问Student对象的python数据库的API,
        为了实现这些,我们要在项目文件夹中的settings.py中注册
        1.在项目中注册app:INSTALLED_APPS中加入app名
        2.运行数据库迁移命令(一定要在项目根目录下)
            python manage.py makemigrations teacher    
                -如果不加app名teacher,则会对(settings.py的INSTALLED里安装过的)所有app进行迁移
            告诉django,我们做了哪些数据库的更改
            迁移,是django对模型的更改方式,会生成迁移文件,类似于app下的migrations文件夹下的0001_initial.py这样,我们甚至可以手动更改迁移文件的内容
            迁移之后,mysql中可以可以进入创建的数据库,这时修改只是被记录下来,数据库中还没有表
            sqlmigrate 从迁移获取sql语句:python manage.py sqlmigrate teacher 0001   ---这里不用写全0001_initial.py,teacher这是应用名称,必须写上
                迁移会生成的SQL语句如下:
                --
                -- Create model Student
                --
                CREATE TABLE `teacher_student` (
                `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,         ---如果我们没有创建主键,这里会自动创建名为id的主键,相当于模型类自动默认给我们添加了这个类属性,
                `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;
        3.运行migrate命令,使迁移生效
            python manage.py migrate teacher    ---如果写上app名,则只会迁移这个app中的模型,不写则注册过的都迁移
            这之后我们创建的数据库中才会生成表,
        # 表名 appname_模型name.lower
           django_migrations是默认生成的记录migration的表
四.数据的增删改查
    (1)工具 djang shell 调试工具(scrapy的shell借鉴了django的)
    用shell之前最好先在环境中装ipython ,然后直接运行命令进入shell,只要装了ipython,默认就能进入ipython的shell
    python manage.py shell
    (2)进入shell命令行后,首先导入models:from teacher.models import Student   ---输一半按tag可以补全
    想查看student中有没有数据,可以:           Student.objects      ----objects是模型的一个方法,它其实是一个管理器,
        它本身也是一个对象,创建了模型它就连上了,每一个模型都有一个objects,通过objects就可以操作、管理模型
    (3)想查询模型中所有的值,可以Student.objects.all()   
         ---它返回的是一个查询集对象,返回的值不算友好,默认返回<QuerySey:[<Student:Student Object(1)>,<Student:Student Object(2)>,....]>
        如果我们想让他运行时直接显示实例对象的各个实例属性打印出来,则模型类中可以重写方法__str__:
        def __str__(self):
            return '%s-%s'%(self.name,self.age)
        这个方法对数据库不造成任何影响,不用做数据库迁移,但是重写后需要重新进入shell,并重新导入库才能起作用,
        模型自动创建了id这个属性,这里重写的__str__方法返回值多个self.id也是可以的
         return '%d-%s-%s' % (self.id, self.name, self.age),创建的实例对象都带个id的实例属性
        如果创建了实例对象,这时候Student.objects.all()  的结果是<QuerySey:[<Student:1-贝吉塔-3>,<Student:2-特兰克斯-17>,....]>
    (4)想查询模型中某个值,可以定义s = Student.objects.get(id=1),然后s,获得符合条件的某实例,s.name,s.age这样还能查到该实例的对应属性值

    (5) 增:
        4种方法:在shell环境中,不管什么方法首先都要保证导入了models:from teacher.models import Student
            1)表中一条数据,对应模型类中的一个实例,即一个对象,创建一条,可以实例化一下,表的字段在实例化的过程中通过传递参数加进去
                (1)实例化:s1 = Student(name='贝吉塔',age='3',qq='123456')
                (2)保存: s1.save()      为了避免输错,实例化后数据库中还没有数据,想把实例化的对象保存到数据库,需要运行save方法
                注意存在数据库中的时间字段一定是UTC时间,为了不同时区不同格式的统一,
                而取出来的时间则转换成settings里设置的时区,取出来的时间指的是是渲染在模板中显示的时间
                模型类实例中怎么查询,打印,出来的还都是utc时间
            2)创建空实例,然后赋值
                (1)先创建一个空实例s2 = Student()
                (2)依次赋值实例属性s2.name = '特兰克斯'
                          s2.age = 17
                          .....
                  (3)保存:s2.save()
            3)直接create:Student.objects.create(实例属性1,实例属性2.。。)
                这种方法直接操作数据库,给表添加记录
                运行这个命令后,创建记录同时,直接可以返回刚创建的对象
            4)get_or_create:类似于上面的create
                s=Student.objects.get_or_create(实例属性1,实例属性2.。。)
                这种方式先查,查完再创建,返回一个元组,元组第一个元素是该对象,第二个元素是是否创建成功:
                    如果模型中已经有该对象,则元组第一个元素则是该对象,第二个元素是false,即没有创建该对象,是查来的
                    如果模型中还没有该对象,则元组第一个元素是该对象,第二个元素是True,即创建了该对象,
                    ***亲测是否同一对象取决于创建时给的参数是否完全一致,前面一样多给个元素,也会创建,而不是返回查询结果和False的元组
                        别的参数相同,改其中一个参数,也会创建
            5)增加模型类实例数据,也可以在app的视图函数中,导入模型类,然后定义函数,增加类的实例,上述四种方法,可以在视图函数模块中,先导入模型类
                from .models import Student
                def add_student(request):
                    方法一:实例化,然后save。。。。
                    方法二:实例化一个空的对象,然后定义实例属性,然后save。。。
                    方法三:直接create
                    方法四:get_or_create
                    return render(request,模板文件)

    (6)查:
            1)Student.objects.all()  --查所有,他返回QuerySet对象
                (1)我们写res=Student.objects.all()的时候,这样写还没有操作数据库,
                它是一个惰性的,只有我们要把这个值计算出来的时候它才操作数据库
                (2)查询集可以看到sql语句print(res.query),结果其实就是相当于select * from teacher_student的sql语句
                (3)shell中输入res的时候返回的查询集,他可以循环可以迭代,还可以切片
                    切片print(res[1:2].query)
                    切片返回的结果比上面不切片的后面多了两个东西LIMIT 1 OFFSET 1  
                    LIMIT --获取数量,OFFSET偏移量
            2)Student.objects.get(条件)   --查询一条,他返回的不是查询集,而是一个对象,
            执行时立刻操作数据库,没有query,拿不到它的sql语句,只能在mysql日志上看到他的sql语句
            相当于数据库中的select * from 表名 where 条件。。。。
            ***get方法返回一条数据,如果匹配到符合条件的有很多条,则会报错
                所以get方法一般只和主键对应,但是表里的主键不见得都叫id
                这里有个快捷方式pk,它代表了表的主键,不管表的主键叫什么,用pk查都可以
            3)filter:res=Student.objects.filter(参数=值)  --返回查询集
                           print(res.query)   -相当于sql中用where的结果

    (7)修改:
            1)赋值:s=Student.objects.get(name='xxx')
                           s.age=16
                           s.save()
                查完修改,用于改一条数据,别忘了save()保存的时候才能把修改保存到数据库
            2)update:Student.objects.filter(name='xxx').update(age=16)
                把匹配出来的所有符合条件的数据的年龄都改成16,返回修改的记录条数
    (8)删除:delete()方法
            1)删一条:s=Student.objects.get(pk=2)
                s.delete()        ----返回一个元组,第一个元素是删除的数据条数,第二个元素是{'表的名称':删除的数据条数}
            2)批量删:Student.objects.filter(sex=1).delete()
                返回元素,(删除的数据条数,{'表名':删除的数据条数})
    (9)计数:Student.objects.count()    ----返回模型类实例数
五。应用到视图:
    1.首先视图函数的模块中导入模型类:from .models import Student
    2.视图函数中student=Student.objects.all()
    3.根据数据库中表的字段修改对应模板的模板变量
   

转载于:https://www.cnblogs.com/bianyimaomaochong/p/10513496.html

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值