返回顶部

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

 

posted on 2019-11-09 11:47  augustyang  阅读(193)  评论(0编辑  收藏  举报

导航