zoukankan      html  css  js  c++  java
  • django的模型层

    django的模型层

    一 创建单表

    1.创建模型

    app01 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,unique=True)
         pub_date=models.DateField()
         price=models.DecimalField(max_digits=8,decimal_places=2)
         publish=models.CharField(max_length=32)

    2.配置数据库 

    settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'orm',           # 要连接的数据库,连接前需要创建好
            'USER':'ysl',           # 连接数据库的用户名
            'PASSWORD':'123456',      # 连接数据库的密码
            'HOST':'10.0.0.51',       # 连接主机,默认本级
            'PORT':3306         #  端口 默认3306
        }
    }

    3. 配置mysql模块

    因为django默认你导入的驱动是MySQLdb

    python3 mysql的驱动是 pymysql
    所以在工orm __init__.py 写入

    import pymysql
    pymysql.install_as_MySQLdb()

    4 打印  orm转换过程中的sql

    settings.py 设置

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

    5 命令行运行命令

    python manage.py makemigrations
    python manage.py migrate

    二 单表添加表记录

    from  app01.models import Book
    
    def  index(request):
    
        # 添加表记录
    
        #方式1
        # book_obj = Book(title="python",price=100,pub_date="2010-10-10",publish="人民出版社")
        # book_obj.save()
    
    
        #方式2
        # book_obj = Book.objects.create(title="php",price=100,pub_date="2011-10-10",publish="人民出版社")
        # print(book_obj.title)  #php
        # print(book_obj.price)   #100
        # print(book_obj.pub_date)    #2011-10-10
    
    
    return    HttpResponse("ok")

    三 查询表记录

    1 all() 方法

    调用者Book.objects  返回值 queryset对象
        # 1)all()方法  调用者Book.objects  返回值 queryset对象
        book_list = Book.objects.all()
        print(book_list)
        #[<Book: Book object (1)>, <Book: Book object (2)>]   [obj1,obj2]
    
        for obj in  book_list:
            print(obj.title,obj.price)
            
        # python 100.00
        # php 100.00
        # go  200.00

    2  first()方法  last() 方法

     调用者 queryset 对象   返回值:model对象
     # 2) first  last 调用者 queryset 对象   返回值:model对象
    
        book_list = Book.objects.all().first()
        book_list = Book.objects.all()[0]
    
        print(book_list)

    3  filter() 方法

    调用者Book.objects 返回值queryset对象

    # 3)  filter() 调用者Book.objects    返回值queryset对象
    book_list = Book.objects.filter(price=100)
    print(book_list)
     #<QuerySet [<Book: python>, <Book: php>]>
    
    book_obj = Book.objects.filter(price=100).first()
    print(book_obj)
    
    ret = Book.objects.filter(price=100,title='python')
    print(ret)

    4 get() 方法

    有且只有一个查询结果时才有意义 返回值:model对象

    # 4)  get  有且只有一个查询结果时才有意义  返回值:model对象
    book_obj = Book.objects.get(title="go")
    book_obj=Book.objects.get(price=100)
    print(book_obj.price)

    5 exclude()  方法 

    调用者Book.objects    返回值 queryset对象   排除go   其他的都打印出来
    ret = Book.objects.exclude(title="go")
    print(ret)

    6 order_by() 方法

    order_by  排序   调用者: queryset对象   返回值:  queryset对象
    ret = Book.objects.all().order_by("id")  #-id  desc       id asc
    ret=Book.objects.all().order_by("price","id")
    print(ret)

    7  count()

    调用者: queryset对象 返回值: int

    ret = Book.objects.all().count()
    print(ret)

    8 exist() 是否为空

    ret = Book.objects.all().exists()
    if ret:
        print("ok")

    9  values()  方法

    调用者: queryset对象  返回值:queryset对象
    # ret = Book.objects.all()
    # for i in ret:
    #     print(i.title)
    
    ret = Book.objects.all().values('title')
    print(ret)
    #<QuerySet [{'title': 'go'}, {'title': 'php'}, {'title': 'python'}]>
    print(ret[0].get("title"))
    #go

    10  values_list() 方法

    调用者: queryset对象 返回值:queryset对象

    ret = Book.objects.all().values_list("price", "title")
    print(ret)
    # <QuerySet [(Decimal('100.00'), 'python'), (Decimal('100.00'), 'php'), (Decimal('200.00'), 'go')]>

    11 distinct() 方法

    调用者: queryset对象  返回值:queryset对象
    ret = Book.objects.all().values("price").distinct()
    print(ret)
    
    #<QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('200.00')}]>

    四 单表查询之模糊查询

    Book.objects.filter(price__in=[100,200,300])
    Book.objects.filter(price__gt=100)
    Book.objects.filter(price__lt=100)
    Book.objects.filter(price__range=[100,200])
    Book.objects.filter(title__contains="python")
    # 不区分p大小写
    Book.objects.filter(title__icontains="Python")
    Book.objects.filter(title__startswith="py")
    Book.objects.filter(pub_date__year=2012)

    五 删除,修改记录

    1 删除记录

    delete: 调用者: queryset对象  model对象

    ret=Book.objects.filter(price=100).delete()
     print(ret)
    
    Book.objects.filter(price=100).first().delete()

    2 修改记录

    update :  调用者: queryset对象

    ret=Book.objects.filter(title="php2").update(title="php")

    六 练习 单表查询图书系统

      实现功能:book单表的增删改查

    1 创建对应的mysql表

    app01/modeles.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,unique=True)
         pub_date=models.DateField()
         price=models.DecimalField(max_digits=8,decimal_places=2)
         publish=models.CharField(max_length=32)
    
         def __str__(self):
              return self.title

    2 设置mysql

    ORM/ORM/setting.py

     1) 设置mysql

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'orm',       # 要连接的数据库,连接前需要创建好
            'USER':'ysl',       # 连接数据库的用户名
            'PASSWORD':'123456',      # 连接数据库的密码
            'HOST':'10.0.0.51',       # 连接主机,默认本级
            'PORT':3306     #  端口 默认3306
        }
    }

     2)把app01注册到项目中 

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01',
    
    ]

    3)配置静态文件

    # static 是静态文件的别名
    STATIC_URL = '/static/'
    
    
    # 配置 静态文件
    STATICFILES_DIRS=[
        os.path.join(BASE_DIR,"static"),
    ]

    4)打印orm转换过程中的sql

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

     5) 配置mysql模块

    因为django默认你导入的驱动是MySQLdb

    python3 mysql的驱动是 pymysql
    所以在工orm __init__.py 写入

    import pymysql
    pymysql.install_as_MySQLdb()

    6)命令行运行命令

    python manage.py makemigrations
    python manage.py migrate

    3 配置url地址

    ORM/ORM/urls.py

    from django.contrib import admin
    from django.urls import path,re_path
    
    from  app01 import  views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("books/",views.books),
        path("addbook/",views.addbook),
        re_path("books/(d+)/delete",views.delete),
        re_path("books/(d+)/change",views.change),
    ]

    4 配置视图

    app01/views.py

    def books(request):
    
        book_list = Book.objects.all()
    
        return  render(request,"books.html",locals())
    
    
    
    def  addbook(request):
    
        if request.method=="POST":
            title = request.POST.get("title")
            price = request.POST.get("price")
            date = request.POST.get("date")
            publish = request.POST.get("publish")
    
            Book.objects.create(title=title,price=price,pub_date=date,publish=publish)
    
            return redirect("/books/")
    
        return render(request, "addbook.html")
    
    
    
    
    def delete(request,id):
        Book.objects.filter(id=id).delete()
    
        return redirect("/books/")
    
    
    
    
    def change(request,id):
        book_obj = Book.objects.filter(id=id).first()
    
        if request.method=="POST":
            title = request.POST.get("title")
            price = request.POST.get("price")
            date = request.POST.get("date")
            publish = request.POST.get("publish")
            Book.objects.filter(id=id).update(title=title,price=price,pub_date=date,publish=publish)
    
            return redirect("/books/")
    
        return   render(request, "change.html",{"book_obj":book_obj})

    5. 配置Template

    1) 设置 static

    2) 配置对应的模版

    base.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <!-- 标题模版-->
        {% block title %}
            <title>base</title>
        {% endblock %}
    
        <link rel="stylesheet" type="text/css" href="/static/bootstrap-3.3.7/css/bootstrap.css">
        <script type="text/javascript" src="/static/jquery-3.4.1.js"></script>
    
        <style>
    
            .header {
                width: 100%;
                height: 50px;
                background-color: #369;
                font-size: 40px;
                text-align: center;
                line-height: 50px;
            }
        </style>
    
    </head>
    <body>
    <div class="header" >图书管理系统</div>
    <div class="container" style="margin-top: 100px;">
        <div class="row">
            <div class="col-lg-6 col-lg-offset-3">
                {% block  content %}
                
                {% endblock %}
    
            </div>
        </div>
    
    </div>
    
    </body>
    </html>
    base.html

    books.html

    {% extends "base.html" %}
    
    
    {% block title %}
        <title>books</title>
    {% endblock title %}
    
    {% block content %}
        <a href="/addbook/" class="btn btn-primary btn-lg">添加书籍</a>
    
        <table class="table table-bordered table-hover" style="margin-top: 10px;">
            <tr>
                <th>书籍名称</th>
                <th>价格</th>
                <th>出版日期</th>
                <th>出版社</th>
                <th>删除操作</th>
                <th>编辑操作</th>
            </tr>
            {% for book in book_list %}
                <tr>
                    <td>{{ book.title }}</td>
                    <td>{{ book.price }}</td>
                    <td>{{ book.pub_date|date:'Y-m-d' }}</td>
                    <td>{{ book.publish }}</td>
                    <td><a href="/books/{{ book.pk }}/delete" class="btn btn-danger">删除</a></td>
                    <td><a href="/books/{{ book.pk }}/change" class="btn btn-info">编辑</a></td>
                </tr>
    
    
            {% endfor content%}
    
        </table>
    {% endblock %}
    books.html

    addbook.html

    {% extends "base.html" %}
    
    
    {% block title %}
    <title>addbook</title>
    {% endblock %}
    
    
    
    {% block content %}
        <form action="" method="post">
            {% csrf_token %}
            <div>
                <label for="">数据名称</label>
                <input type="text" class="form-control" name="title">
            </div>
            <div>
                <label for="">价格</label>
                <input type="text" class="form-control" name="price">
            </div>
            <div>
                <label for="">出版日期</label>
                <input type="date" class="form-control" name="date">
            </div>
            <div>
                <label for="">出版社</label>
                <input type="text" class="form-control" name="publish">
            </div>
    
        <input  type="submit" class="btn btn-success btn-lg pull-right" style="margin-top: 10px;">
        </form>
    {% endblock %}
    addbook.html

    change.html

    {% extends "base.html" %}
    
    
    {% block title %}
    <title>change</title>
    {% endblock %}
    
    
    
    
    {% block content %}
        <form action="" method="post">
            {% csrf_token %}
            <div>
                <label for="">数据名称</label>
                <input type="text" class="form-control" name="title" value="{{ book_obj.title }}">
            </div>
            <div>
                <label for="">价格</label>
                <input type="text" class="form-control" name="price" value="{{ book_obj.price }}">
            </div>
            <div>
                <label for="">出版日期</label>
                <input type="date" class="form-control" name="date" value="{{ book_obj.pub_date|date:'Y-m-d' }}">
            </div>
            <div>
                <label for="">出版社</label>
                <input type="text" class="form-control" name="publish" value="{{ book_obj.publish }}">
            </div>
    
        <input  type="submit" class="btn btn-success btn-lg pull-right" style="margin-top: 10px;">
        </form>
    {% endblock %}
    change.html
  • 相关阅读:
    React 懒加载组件
    按键精灵Q语言基础
    zookeeper安装和配置(单机+伪集群+集群)
    hbase-site.xml 配置详解
    MySQL主从复制与读写分离概念及架构分析
    mysql 主从复制原理
    Struts2教程
    广告点击率预测(CTR) —— 在线学习算法FTRL的应用
    搭建git服务器
    git常用命令
  • 原文地址:https://www.cnblogs.com/augustyang/p/11824885.html
Copyright © 2011-2022 走看看