django--ORM的单表操作

发布时间:2018-06-28 15:18:58编辑:Run阅读(5234)

    Django--ORM单表操作


    创建一个新的django项目

    blob.png


    项目目录结构:

    blob.png


    Django连接数据库配置

    重点:

    第一步:

    修改settings.py文件

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 数据库引擎,使用的是mysql
            'NAME': 'day71',                       # 数据库名
            'USER': 'django123',                   # 账号
            'PASSWORD': 'django123',               # 密码
            'HOST': '192.168.11.106',              # ip地址
            'PORT': 3306,                          # 端口
        }
    }


    第二步:

    修改models.py文件,创建表结构

    from django.db import models
    
    # Create your models here.
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
        pub_date = models.DateField()
        price = models.DecimalField(max_digits=8, decimal_places=2)
        publish = models.CharField(max_length=32)


    第三步:

    在settings.py同目录找到__init__.py文件,添加

    注意:如果pymysql没有安装,先pip3 install pymsyql

    import pymysql
    pymysql.install_as_MySQLdb()


    最后,点击Tools里面的,Run manage.py Task...

    blob.png


    先运行

    makemigrations 

    它的作用相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件



    Migrations for 'app01':

      app01\migrations\0001_initial.py

        - Create model Book


    再运行

    migrate

    它是将该改动作用到数据库文件,比如创建表,修改表字段之类的操作


    Operations to perform:

      Apply all migrations: admin, app01, auth, contenttypes, sessions

    Running migrations:

      Applying contenttypes.0001_initial... OK

      Applying auth.0001_initial... OK

      Applying admin.0001_initial... OK

      Applying admin.0002_logentry_remove_auto_add... OK

      Applying app01.0001_initial... OK

      Applying contenttypes.0002_remove_content_type_name... OK

      Applying auth.0002_alter_permission_name_max_length... OK

      Applying auth.0003_alter_user_email_max_length... OK

      Applying auth.0004_alter_user_username_opts... OK

      Applying auth.0005_alter_user_last_login_null... OK

      Applying auth.0006_require_contenttypes_0002... OK

      Applying auth.0007_alter_validators_add_error_messages... OK

      Applying auth.0008_alter_user_username_max_length... OK

      Applying auth.0009_alter_user_last_name_max_length... OK

      Applying sessions.0001_initial... OK



    执行完后,可以用pycharm自带的mysql连接工具测试


    blob.png


    blob.png


    表已经成功创建

    blob.png



    django-ORM插入一条数据

    更改urls.py文件,添加一个路径add

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add/', views.add),
    
    ]


    更改views.py文件

    from django.shortcuts import render,HttpResponse
    from app01.models import Book
    
    # Create your views here.
    def add(request):
        # 实例化一个对象,并传参
        book = Book(title='西游记', price="88.88", pub_date="2013-12-12", publish='第一出版社')
        book.save()  # 这种方法必须要save(),不然数据不会保存
        return HttpResponse('添加成功')


    启动项目:

    blob.png


    访问

    http://127.0.0.1:8000/add/

    blob.png


    刷新数据库看看

    blob.png


    第二种方法:推荐使用

    objects: 表示管理器

    book.objects : 管理book表

    create: 添加

    from django.shortcuts import render,HttpResponse
    from app01.models import Book
    
    # Create your views here.
    def add(request):
        book_obj = Book.objects.create(title='红楼梦', price="66.66", pub_date="2014-08-22", publish='第二出版社')
        print(book_obj)  # 返回一个对象,包含记录的所有信息
        print(book_obj.title)
        print(book_obj.price)  
        print(book_obj.publish)
        print(book_obj.pub_date)
        return HttpResponse('添加成功')



    访问http://127.0.0.1:8000/add

    blob.png


    数据库里面看看,第二条数据添加成功

    blob.png


    控制台看看:

    blob.png


    更改字段约束条件,设置日期允许为空,添加一个新的字段设置默认值

    models.py文件

    from django.db import models
    
    # Create your models here.
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=32)
        pub_date = models.DateField(null=True)  # null=True 设置允许为空
        price = models.DecimalField(max_digits=8, decimal_places=2)
        publish = models.CharField(max_length=32)
        is_pub = models.BooleanField(default=True)


    执行同步数据库更新命令,否则mysql不更新

    点击Tools里面的Run manage.py Task....

    blob.png


    执行命令:

    makemigrations

    blob.png


    会发现app01里面的migrations多出一个文件,此文件记录对应的操作

    blob.png


    在执行命令,同步数据库

    migrate

    blob.png


    刷新数据库,新创建的字段已经被添加

    blob.png


    添加一个日期为空的书籍

    views.py

    from django.shortcuts import render,HttpResponse
    from app01.models import Book
    
    # Create your views here.
    def add(request):
        # 日期不写
        book_obj = Book.objects.create(title='三国演义', price="77.77", publish='第三出版社')
        print(book_obj)  # 返回一个对象,包含记录的所有信息
        print(book_obj.title)
        print(book_obj.price)
        print(book_obj.publish)
        print(book_obj.pub_date)
        return HttpResponse('添加成功')


    访问

    http://127.0.0.1:8000/add

    blob.png



    刷新数据库,pub_date为空,成功添加

    blob.png


    如果想查看ORM执行的sql语句,打开日志,就可以了

    修改settings.py,在最后面添加

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'level': 'DEBUG',
                'propagate': True,
            },
        },
    }


    在添加一本书:

    from django.shortcuts import render,HttpResponse
    from app01.models import Book
    
    # Create your views here.
    def add(request):
        book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社')
        print(book_obj)  # 返回一个对象,包含记录的所有信息
        print(book_obj.title)
        print(book_obj.price)
        print(book_obj.publish)
        print(book_obj.pub_date)
        return HttpResponse('添加成功')


    访问:

    http://127.0.0.1:8000/add

    blob.png


    查看控制台输出信息:

    blob.png




    添加查询视图

    查询所有记录语法


    Book.objects.all()

    修改urls.py 路由控制文件,添加查询路由

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add/', views.add),
        path('query/', views.query),
    
    ]


    修改views.py 添加查询功能函数

    from django.shortcuts import render,HttpResponse
    from app01.models import Book
    
    # Create your views here.
    def add(request):
        book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社')
        print(book_obj)  # 返回一个对象,包含记录的所有信息
        return HttpResponse('添加成功')
    
    
    def query(request):
        # all()
        book_list = Book.objects.all()  # 返回一个queryset数据类型
        # queryset数据类型[obj,obj,obj], list里面存放的都是对象
        print(book_list)
        for obj in book_list:
            # obj相当于表里面的每条记录
            print(obj.title, obj.price)  # 打印每个obj的书名,价格
        return HttpResponse('查询成功')


    访问:

    http://127.0.0.1:8000/query

    blob.png


    查看控制台输出信息

    blob.png


    查询一条记录,修改上面的查询函数的代码

    语法: 括号里面写条件

    Book.objects.filter()

    def query(request):
        ret = Book.objects.filter(price=66.66)
        for obj in ret:
            print(obj.title,obj.price)
        return HttpResponse('查询成功')


    访问:

    http://127.0.0.1:8000/query

    blob.png



    first,last,切片操作

    语法:

    Book.objects.all().first()

    Book.objects.all().last()

    Book.objects.all()[1:3]

    def query(request):
        # 查询第一条记录
        obj1 = Book.objects.all().first()
        print(obj1.title, obj1.price)
    
        # 查询最后一条记录
        obj2 = Book.objects.all().last()
        print(obj2.title, obj2.price)
    
        # 切片操作
        obj3 = Book.objects.all()[1:3]
        for i in obj3:
            print(i.title, i.price)
        return HttpResponse('查询成功')

    访问:http://127.0.0.1:8000/query

    blob.png


    查询表记录

    查询API

    <1> all():                  查询所有结果
      
    <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象
      
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
                                如果符合筛选条件的对象超过一个或者没有都会抛出错误。
      
    <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象
     
    <5> order_by(*field):       对查询结果排序
      
    <6> reverse():              对查询结果反向排序
      
    <8> count():                返回数据库中匹配查询(QuerySet)的对象数量。
      
    <9> first():                返回第一条记录
      
    <10> last():                返回最后一条记录
      
    <11> exists():              如果QuerySet包含数据,就返回True,否则返回False
     
    <12> values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
                                model的实例化对象,而是一个可迭代的字典序列
    
    <13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <14> distinct():            从返回结果中剔除重复纪录


    基于双下划线的模糊查询

    Book.objects.filter(price__in=[100,200,300])   查询价格等于100,200,300的书籍
    
    Book.objects.filter(price__gt=100)             查询价格大于100
    
    Book.objects.filter(price__gte=100)            查询价格大于等于100
    
    Book.objects.filter(price__lt=100)             查询价格小于100
    
    Book.objects.filter(price__lte=100)            查询价格小于等于100
    
    Book.objects.filter(price__range=[100,200])    查询100到200之间的
    Book.objects.filter(title__contains="python")  查询title中是否包含有python
    Book.objects.filter(title__icontains="python") 获得title字段里含有python的Book对象集合
    Book.objects.filter(title__startswith="py")    查询以py开头的书籍
    Book.objects.filter(pub_date__year=2012)       查询pub_date字段year=2012



    update数据

    修改urls.py,添加一条路由change

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add/', views.add),
        path('query/', views.query),
        path('change/', views.change),
    
    ]


    修改views.py,添加一个修改函数

    查询id=1的字段,并更改price=333

    def change(request):
        id = 1
        Book.objects.filter(id=id).update(price=333)
        return HttpResponse('修改成功')


    访问:http://127.0.0.1:8000/change/

    blob.png


    查看数据是否修改成功,已经修改成功

    blob.png



    delete数据

    修改urls.py,添加一条路由delbook

    from django.contrib import admin
    from django.urls import path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add/', views.add),
        path('query/', views.query),
        path('change/', views.change),
        path('delbook/', views.delbook),
    
    ]


    修改views.py,添加一个删除函数

    def delbook(request):
        Book.objects.filter(title='水浒传').delete()
        return HttpResponse("删除成功")


    访问: http://127.0.0.1:8000/delbook/

    blob.png


    查看数据是否成功删除,成功删除

    blob.png



    需求:url参数为2,就删除id为2的记录

    例:http://127.0.0.1/delbook/2

    修改urls.py,delbook路由

    from django.contrib import admin
    from django.urls import path, re_path
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add/', views.add),
        path('query/', views.query),
        path('change/', views.change),
        re_path('delbook/(?P<id>\d+)', views.delbook),
    
    ]


    修改views.py

    def delbook(request,id):  # 接收id参数
        Book.objects.filter(id=id).delete()
        return HttpResponse("删除成功")


    访问:http://127.0.0.1:8000/delbook/2

    如果数据不存在,也会提示删除成功

    blob.png


    查看数据库里面是否更改

    blob.png



    查询练习:

    sql语句:

     INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) 
     VALUES ('1', 'python基础', '2017-06-01', '200.00', '人民出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) 
    VALUES ('2', '西游记', '2017-08-08', '100.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('3', '红楼梦', '2017-08-10', '50.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('4', '水浒传', '2017-08-25', '150.00', '人民出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('5', '三国演义', '2017-12-20', '88.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('6', 'python爬虫', '2018-02-10', '300.00', '人民出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('7', 'python大数据', '2018-05-15', '350.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('8', 'java', '2017-08-11', '55.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('9', 'go', '2018-06-04', '66.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('10', 'php', '2018-06-08', '99.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('11', 'c', '2018-05-22', '156.00', '苹果出版社', '1');
    INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`)
     VALUES ('12', 'c++', '2018-04-17', '650.00', '苹果出版社', '1');


    表数据如下:

    blob.png


    1 查询苹果出版社出版过的价格大于200的书籍

    ret = Book.objects.filter(price__gt=200, publish='苹果出版社', is_pub=True).values('title', 'price')
    for i in ret:
        print(i['title'], i['price'])

    结果:

    python大数据 350.00

    c++ 650.00


    2 查询2017年6月出版的所有以py开头的书籍名称

    ret = Book.objects.filter(title__startswith='py',pub_date__year=2017, pub_date__month=6).values('title')
    for i in ret:
        print(i['title'])

    结果:

    python基础



    3 查询价格为50,100或者150的所有书籍名称及其出版社名称 

    ret = Book.objects.filter(price__in=[50,100,150]).values('title', 'publish')
    for i in ret:
        print(i['title'], i['publish'])

    结果:

    西游记 苹果出版社

    红楼梦 苹果出版社

    水浒传 人民出版社


    4 查询价格在100到200之间的所有书籍名称及其价格

    ret = Book.objects.filter(price__range=[100, 200]).values('title', 'price')
    for i in ret:
        print(i['title'], i['price'])

    结果:

    python基础 200.00

    西游记 100.00

    水浒传 150.00

    c 156.00


    5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)

    ret = Book.objects.filter(publish='人民出版社').order_by('price').reverse().values('title','price','publish')
    ..distinct()
    for i in ret:
        print(i['title'], i['price'],i['publish'])

    结果:

    python爬虫 300.00 人民出版社

    python基础 200.00 人民出版社

    水浒传 150.00 人民出版社


    6 查询价格大于200的书籍的个数

    ret = Book.objects.filter(price__gt=200).count()
    print(ret)

    结果:

    3


    7 查询价格不等于100的所有书籍

    ret = Book.objects.exclude(price=100).values('id', 'title', 'price', 'publish')
    for i in ret:
        print(i['id'], i['title'], i['price'], i['publish'])

    结果:

    1 python基础 200.00 人民出版社

    3 红楼梦 50.00 苹果出版社

    4 水浒传 150.00 人民出版社

    5 三国演义 88.00 苹果出版社

    6 python爬虫 300.00 人民出版社

    7 python大数据 350.00 苹果出版社

    8 java 55.00 苹果出版社

    9 go 66.00 苹果出版社

    10 php 99.00 苹果出版社

    11 c 156.00 苹果出版社

    12 c++ 650.00 苹果出版社


    8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)

    ret = Book.objects.filter(publish='苹果出版社')[3:7].values('id','title','price','publish')
    for i in ret:
        print(i['id'], i['title'], i['price'], i['publish'])

    结果:

    7 python大数据 350.00 苹果出版社

    8 java 55.00 苹果出版社

    9 go 66.00 苹果出版社

    10 php 99.00 苹果出版社


关键字