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)
    #[, ]   [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)
 #, ]>

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)
#
print(ret[0].get("title"))
#go

10  values_list() 方法

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

ret = Book.objects.all().values_list("price", "title")
print(ret)
# 

11 distinct() 方法

调用者: queryset对象  返回值:queryset对象
ret = Book.objects.all().values("price").distinct()
print(ret)

#

四 单表查询之模糊查询

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>basetitle>
    {% 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>bookstitle>
{% 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>addbooktitle>
{% 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>changetitle>
{% 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