美文网首页python想法简友广场
Python(五十)模型基础

Python(五十)模型基础

作者: Lonelyroots | 来源:发表于2022-01-15 07:00 被阅读0次

    从2021年9月2日发文至今,Python系列(包括代码在内)共计92026个字、五十篇!

    1. Django的ORM简介

    1.1. Django的ORM系统的分析:

    1. ORM概念:对象关系映射(Object Relational Mapping,简称ORM)
    2. ORM的优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据。
    Django的ORM系统分析

    1.2. Django模型映射关系:

    1. 模型类必须都写在app下的models.py文件中。
    2. 模型如果需要映射到数据库,所在的app必须被安装。
    3. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。

    2. 数据库连接配置

    python与mysql数据库连接配置:
    先在Linux虚拟机中,输入workon django15-16:进入到之前创建的django15_16的虚拟环境中,然后输入mysql -uadmin -p:回车并输入密码,即可进入到mysql数据库中,然后先创建数据库Django15_16:CREATE DATABASE Django15_16;

    在如下界面,使用startapp models_test指令,新创建一个名为models_test的app: 配置已安装的app:
    在settings文件里写好连接的MySQL数据库,如下所示:

    在django15_16主项目的__init__.py文件中安装数据库连接器,让连接器去寻找配置信息。

    # 六、模型基础:
    
    import pymysql
    
    pymysql.install_as_MySQLdb()        # 安装数据库连接器,连接器去寻找配置信息。
    

    3. 模型的创建与映射

    models.py代码:

    # 六、模型基础:一、Django模型映射关系
    
    from django.db import models
    
    # Create your models here.
    
    class User(models.Model):       # 继承了模型类
        # 这里是类属性,但也是数据库里的字段
        id = models.AutoField(primary_key=True)     # id,自增长且主键约束
        name = models.CharField(max_length=30)      # 字符类型,默认情况下为非空约束
        # name = models.CharField(max_length=30,null=True)      # 字符类型,允许为空
        age = models.IntegerField()         # 整型
    

    要创建映射文件:
    ①可以在pycharm里输入makemigrations models_test
    ②也可以在linux虚拟机里输入python manage.py makemigrations models_test


    然后将数据库的表格下载下来。

    可以清楚地发现0001_initial.py的文件出现在你创建的模板app models_test文件夹里,点开查看如下图所示:

    也可以登录通过端口转发后远程连接的Linux虚拟机,输入如下的指令,查看表—如果有忘记的可以回过头来看看我发的Linux系统如何操作MySQL数据库的教程。

    可以在Linux系统中输入python manage.py migrate models_test:执行以下命令,将映射文件中的映射数据提交到数据库中。也可以在pycharm里输入migrate models_test。【注】该步命令应与创建映射文件的命令成对存在,不可以在两步操作之间,对数据库进行修改。

    数据库操作

    1. 先设计数据库
    2. 创建库和表
    3. 如果出现模型类和数据表不一致的情况:先删除pycharm里的所有映射文件,再删除Ubuntu里的所有映射文件,接着将映射表对于APP的所有记录删除,最后重新映射提交。

    4. 数据的增删改查

    models_test这个app文件夹中的urls.py文件代码如下:

    # 六、模型基础:
    from django.urls import path
    # 从同级目录下导入文件
    from . import views
    
    urlpatterns = [
        path('add/',views.add_user),    # 增
        path('select/',views.select_user),     # 查
        path('update/',views.update_user),   # 改
        path('delete/',views.delete_user),     # 删
    ]
    

    下方代码中重写了__str__这个魔术方法,不然增删改查操作中,打印出来的数据都为类对象。

    models_test下方的models.py模型文件如下所示:

    # 六、模型基础:三、Django模型映射关系
    
    from django.db import models
    
    # Create your models here.
    
    class User(models.Model):       # 继承了模型类
        # 这里是类属性,但也是数据库里的字段
        id = models.AutoField(primary_key=True)     # id,自增长且主键约束
        name = models.CharField(max_length=30)      # 字符类型,默认情况下为非空约束
        # name = models.CharField(max_length=30,null=True)      # 字符类型,允许为空
        age = models.IntegerField()         # 整型
    
        # # 修改表名
        # class Meta:
        #     db_table = 'user'
    
        def __str__(self):
            return f'id:{self.id},name:{self.name},age:{self.age}'
    

    4.1. 增

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import User        # 导入.models这个文件目录下的User模型类
    
    # Create your views here.
    
    # 六、模型基础:四、数据的增删改查
    
    # 添加数据
    def add_user(request):
        # # 方法一,类的实例化赋值。
        # zf = User(name='追风',age=20)
        # zf.save()       # 保存数据
        # return HttpResponse('添加成功!')
    
        # # 方法二,类的实例化赋值。
        # chen = User()
        # chen.name = '晨'
        # chen.age = 21
        # chen.save()
        # return HttpResponse('添加成功!')
    
        # # 方法三,使用create方法直接创建对象,作为数据表的记录。
        # User.objects.create(name='摸鱼',age=80)
        # return HttpResponse('添加成功!')
    
        # 前三个方法都会重复添加,第四个方法不会。
        # 方法四,使用get_or_create方法可以防止添加重复的顺序
        User.objects.get_or_create(name='chenhong',age='21')
        return HttpResponse('添加成功!')
    

    4.2. 查

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import User        # 导入.models这个文件目录下的User模型类
    
    # Create your views here.
    
    # 六、模型基础:四、数据的增删改查
    
    
    # 查询数据
    def select_user(request):
        # # 查询所有数据
        # res = User.objects.all()      # all查询所有数据
        # print(res)        # 这里重写了str方法,具体可看Python(十三)面向对象高级里的输出魔术方法。
        # return HttpResponse('查询成功!')
    
        # 条件查询:
        res = User.objects.filter(name='追风')        # filter查询到多少数据,就得到多少数据。
        # res = User.objects.get(id=4)        # get只能用于唯一值的查询,不能同时查询多条数据。
        print(res)
        return HttpResponse('条件查询成功!')
    

    4.3. 改

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import User        # 导入.models这个文件目录下的User模型类
    
    # Create your views here.
    
    # 六、模型基础:四、数据的增删改查
    
    
    # 修改数据
    def update_user(request):
        # # 方法一:
        # res = User.objects.get(id=1)
        # res.age = 21
        # res.save()
        # return HttpResponse('修改成功!')
    
        # 方法二
        # 这种方式修改只能用filter,因为get没有update方法
        User.objects.filter(name='摸鱼').update(age=70)
        return HttpResponse('修改成功!')
    

    4.4. 删

    from django.shortcuts import render
    from django.http import HttpResponse
    from .models import User        # 导入.models这个文件目录下的User模型类
    
    # Create your views here.
    
    # 六、模型基础:四、数据的增删改查
    
    
    # 删除数据
    def delete_user(request):
        # # 删除部分数据,get和filter都有delete方法。
        # User.objects.get(id=2).delete()
        # User.objects.filter(id=2).delete()
        # return HttpResponse('删除成功!')
    
        # 删除全部数据。
        User.objects.all().delete()
        return HttpResponse('删除成功!')
    

    文章到这里就结束了!希望大家能多多支持Python(系列)!六个月带大家学会Python,私聊我,可以问关于本文章的问题!以后每天都会发布新的文章,喜欢的点点关注!一个陪伴你学习Python的新青年!不管多忙都会更新下去,一起加油!

    Editor:Lonelyroots

    相关文章

      网友评论

        本文标题:Python(五十)模型基础

        本文链接:https://www.haomeiwen.com/subject/avhzcrtx.html