Django之Model

1.  Django模型概述

    Django使用自带的ORM

    ORM(Object Relational Mapping) 用于实现面向对象编程语言里不同类型系统的数据之间的转换

    

    优点:

      提高开发效率

      不同数据库平滑切换 

    缺点:

      ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。

      长期写 ORM 代码,会降低编写 SQL 语句的能力。

    ORM解析过程:

      1.  ORM 会将 Python 代码转成为 SQL 语句。

      2.  SQL 语句通过 pymysql 传送到数据库服务端。 

      3.  在数据库中执行 SQL 语句并将结果返回。

      

2.  数据库配置

    1.  创建mysql数据库,因为ORM只能操作数据表,所以库还是需要自己手工创建。

        create database yangjianbo default charset=utf8;

    2.  在项目的settings.py文件中,修改以下内容:

DATABASES = {
    'default':
    {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'yangjianbo', # 数据库名称
        'HOST': '172.168.1.222', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 37118, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '**********', # 数据库密码
    }
}

    3.  Django使用pymysql模块连接mysql数据库          

        1.  linux安装pymysql

            pip3 install pymysql

        2.  pycharm安装pymysql

            

        3.  在与settings.py同级目录下的__init__.py中引入模块,进行配置

import pymysql
pymysql.install_as_MySQLdb()

3.  定义模型

    1.  创建项目和应用

        参照前文

    2.  创建表结构

        1.  修改应用下的model.py文件,定义一个类

from django.db import models
class students(models.Model):
    name = models.CharField(max_length=20)

        2.  生成迁移文件

            python manage.py makemigrations [应用名称]

              这个命令用于告诉 Django 你对模型做了哪些修改(添加了新模型、修改了字段等),并且希望这些修改反映在数据库中。执行这个命令后,Django 会检测你的模型定义文件(通常是 models.py),并生成与之相关的迁移文件(migration files),这些文件描述了如何在数据库中进行相应的更改。

        3.  应用迁移文件到数据库         

            python manage.py migrate [应用名称]

              这个命令用于实际地应用迁移文件,即将模型的变更应用到数据库中。执行这个命令后,Django 会查找尚未应用的迁移文件并执行它们,将数据库结构更新为与模型定义文件中的内容一致。

        4.  在数据库上查一下表结构

                   

            看到产生了很多表,其中我自己的APP表为yangjianbo_student,表中有两个字段,一个是自动产生的id,并且是主键,一个是在model.py中定义的。

4.  数据库操作简单介绍

    以上面的students作为例子

    1.  添加数据

        1.  在应用下面,创建一个单独的python文件,当然你也可以直接用views.py,但是最好是独立使用一个py文件

# -*- coding: utf-8 -*-

from django.http import HttpResponse
from shuaige.models import students

# 数据库操作
def testdb(request):
    test1 = students(name='yiakun')
    test1.save()
    return HttpResponse("<p>数据添加成功</p>")

        2.  在urls.py文件中,创建对应的path,需要先把对应的文件导入进来 

from django.contrib import admin
from django.urls import path
from shuaige import tests
urlpatterns = [
    path('testdb/',tests.testdb)
]

        3.  访问http://127.0.0.1:8000/testdb

    2.  获取数据

# -*- coding: utf-8 -*-

from django.http import HttpResponse

from yangjianbo.models import students



def testdb(request):
    # 初始化
    response = ""
    response1 = ""

    # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    list = students.objects.all()

    # filter相当于SQL中的WHERE,可设置条件过滤结果
    response2 = students.objects.filter(id=1)

    # 获取单个对象
    response3 = students.objects.get(id=2)

    # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    response4=students.objects.order_by('name')[0:2]

    # 数据排序
    response5=students.objects.order_by("id")

    # 上面的方法可以连锁使用
    response6=students.objects.filter(id=2).order_by("id")

    # 输出所有数据
    for var in list:
        response1 += var.name + " "
    response = response1
    return HttpResponse("<p>" + response + "</p>")

    3.  更新数据

def updatedata(request):
    # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    test1 = students.objects.get(id=2)
    test1.name = 'diaomaohou'
    test1.save()

    # 另外一种方式
   # test1= students.objects.filter(id=1).update(name='akun')

    # 修改所有的列
    # students.objects.all().update(name='yuanshao')

    return HttpResponse("<p>修改成功</p>") 

    4.  删除数据

def deldata(request):
    # 删除id=1的数据
    test1 = students.objects.get(id=1)
    test1.delete()

    # 另外一种方式
    # Test.objects.filter(id=1).delete()

    # 删除所有数据
    # Test.objects.all().delete()
    return HttpResponse("<p>删除成功</p>")

5.  单表操作

    1.  创建模型并插入数据

        1.  在app目录的model.py中添加以下类

class Sites(models.Model):
    id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
    title = models.CharField(max_length=32) # 书籍名称
    price = models.DecimalField(max_digits=5, decimal_places=2) # 书籍价格
    publish = models.CharField(max_length=32) # 出版社名称
    pub_date = models.DateField() # 出版时间

        2.  在命令行执行

python manage.py makemigrations
python manage.py migrate

        3.  在app目录的urls.py中添加

from django.contrib import admin
from django.urls import path
from shuaige import views
from shuaige import book
urlpatterns = [
    path('admin/', admin.site.urls),
    path('add_book/',book.add_book)
]

        4.  在app目录下的book.py文件中添加

from django.http import HttpResponse
from shuaige.models import Sites
def add_book(request):
    book = Sites(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8")
    book.save()
    return HttpResponse("<p>数据添加成功!</p>")

        5.  访问地址http://172.16.7.244:8081/add_book

        6.  第二种方法插入数据

def add_book(request):
    books = Sites.objects.create(title="如来神掌",price=200,publish="功夫出版社",pub_date="2010-10-10")
    print(books, type(books)) # Book object (18)
    return HttpResponse("<p>数据添加成功!</p>")

    2.  查找数据

        1.  all()方法来查询所有内容

            返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。    

            urls.py内容

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
]

            views.py内容

def findall_book(request):
    books = models.Sites.objects.all()
    # print(books,type(books)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
    for i in books:
        print (i,i.title)
    return HttpResponse("<p>查找成功!</p>")

        2.  filter()用于查询符合条件的数据

            返回的是 QuerySet 类型数据,类似于 list,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。

            pk=3 的意思是主键 primary key=3,相当于 id=3。

            因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。

            views.py文件

def filter_book(request):
    books = models.Sites.objects.filter(pk=3)
    print(books)
    print("//////////////////////////////////////")
    books = models.Sites.objects.filter(publish='菜鸟出版社', price=300)
    print(books, type(books))  # QuerySet类型,类似于list。
    return HttpResponse("<p>查找成功!</p>")

            urls.py文件

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
]

        3.  exclude()方法用于查询不符合条件的数据

            返回的是 QuerySet 类型数据,类似于 list,里面放的是不满足条件的模型类的对象,可用索引下标取出模型类的对象。

            views.py

def exclude_book(request):
    books = models.Sites.objects.exclude(pk=3)
    print(books)
    print("//////////////////////////////////////")
    books = models.Sites.objects.exclude(publish='菜鸟出版社', price=300)
    print(books, type(books))  # QuerySet类型,类似于list。
    return HttpResponse("<p>查找成功!</p>")

            urls.py    

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
]

        4.  get()方法用于查询符合条件的返回模型类的对象只能为一个

            超过了一个或没有就报错。返回的是模型对象。

            views.py

def get_book(request):
    books = models.Sites.objects.get(pk=3)
    # books = models.Sites.objects.get(pk=5)
    print(books,type(books))
    return HttpResponse("<p>查找成功!</p>") 

            urls.py    

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
]           

            结果:

              1.  有且只有一个,结果:Sites object (3) <class 'yangjianbo.models.Sites'>

              2.  如果超过一个或没有结果,那么报错。

              

        5.  order_by()方法用于对查询结果进行排序

            返回的是QuerySet类型数据,可用索引下标取出模型类的对象。

              注意:

                1.  参数的字段名要加引号

                2.  降序为在字段前面加个负号-

            views.py

def order_book(request):
    # books = models.Sites.objects.get(pk=3)
    books = models.Sites.objects.order_by("price")  #按照price升序排列
    print(book,type(books))
    # books = models.Sites.objects.order_by("-price")  #按照price降序排列

    return HttpResponse("<p>查找成功!</p>")

            urls.py  

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
]

        6.  reverse()方法用于对查询结果进行反转

            返回的是QuerySet类型,可用索引下标取出模型的对象

            views.py

def reverse_book(request):
    # 按照价格降序排列:降序再反转
    books = models.Sites.objects.order_by("-price").reverse()
    print(books,type(books))
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
]

            结果:  先把数据按照价格降序,然后进行反转就是升序。

        7.  count()方法用于查询结果的统计,返回的是整数

            views.py

def count_book(request):
    books=models.Sites.objects.count()
    print(books)
    return HttpResponse("<p>查找成功!</p>")

            urls.py              

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
]

        8.  first()返回第一条数据,返回的数据是模型类的对象

            views.py

def first_book(request):
    books=models.Sites.objects.first()
    print(books.price)
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
]

        9.  last()返回最后一条数据,返回的数据是模型类的对象,不能用索引下标-1,ORM没有逆序索引。

            views.py

def last_book(request):
    books=models.Sites.objects.last()
    print(books.price,books.title)
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
]

        10.  exist()方法用于判断查询的结果QuerySet列表里是否有数据      

            返回的数据类型是布尔,有为true,没有为false

            注意:判断的数据类型只能为QuerySet类型数据,不能为整型和模型类的对象。

            views.py

def exists_book(request):
    # books=models.Sites.objects.exists() #显示的结果为True
    # books=models.Sites.objects.last().exists()  #显示的结果报错,说没有这个属性exists,因为last()的数据类型是对象
    books=models.Sites.objects.count().exists() #显示的结果报错,说int没有这个属性exists,因为count()的数据类型为整型
    print(books)
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
]

            结果:  返回的结果为布尔值,true或者false,只支持QuerySet类型,其它类型没有exists这个属性。

        11.  valuse()方法用于查询部分字段的数据

            返回的是QuerySet类型数据,类似于list,里面不是模型类的对象,而是一个可迭代的字典序列,字典里的键是字段,值是数据。

            注意:

              参数的字段名要加引号

              想要字段名和数据用values

            views.py

def values_book(request):
    books=models.Sites.objects.values("title")
    print(books)
    print(books[2])
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
]

            结果:

              

        12.  values_list()方法用于查询部分字段的数据

            返回的是QuerySet类型数据,类似于list,里面不是模型类的对象,而是一个个元组,元组里放的是查询字段对应的数据

            注意:

              参数的字段名要加引号

              只想要数据用values_list

            views.py

def values_list_book(request):
    books=models.Sites.objects.values_list("title")
    print(books)
    print(books[2])
    return HttpResponse("<p>查找成功!</p>")    

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
]  

            结果:

<QuerySet [('菜鸟教程',), ('菜鸟教程',), ('如来神掌',), ('猴子偷桃',), ('袁绍吃鸡',)]>
('如来神掌',)

        13.  distinct()方法用于对数据进行去重

            返回的是QuerySet类型数据

            注意:

              对模型类的对象去重没有意义,因为每个对象都是不一样的存在

              distinct()一般是联合values或者values_list使用

            views.py

def distinct_book(request):
    # 查询一共有多少个出版社
    books = models.Sites.objects.values_list("title").distinct() # 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
    books = models.Sites.objects.distinct()  #返回的结果是QuerySet
    print(books)
    return HttpResponse("<p>查找成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
    url(r'distinct_book/', views.distinct_book),
] 

            结果:

<QuerySet [('菜鸟教程',), ('如来神掌',), ('猴子偷桃',), ('袁绍吃鸡',)]> 
<QuerySet [<Sites: Sites object (1)>, <Sites: Sites object (2)>, <Sites: Sites object (3)>, <Sites: Sites object (4)>, <Sites: Sites object (5)>]>

        14.  filter()方法还可以用于模糊查询

            views.py

def filter_book(request):
    # books = models.Sites.objects.filter(pk=3)
    # books = models.Sites.objects.filter(publish='菜鸟出版社', price=300)
    # books=models.Sites.objects.filter(price__in=[200,400])  #查询价格为200或者400的图书
    # books = models.Sites.objects.filter(price__gt=200)  #查询价格大于200的图书
    # books = models.Sites.objects.filter(price__gte=200)     #查询价格大于等于200的图书
    # books = models.Sites.objects.filter(price__lt=200)  #查询价格小于200的图书
    # books = models.Sites.objects.filter(price__lte=200) #查询价格小于等于200的图书
    # books = models.Sites.objects.filter(price__range=[100,400])     #查询价格在100,到400之间的图书,包含100和400
    # books = models.Sites.objects.filter(title__contains="桃")    #查询书名包含"桃"的图书
    # books=models.Sites.objects.filter(title__icontains="鸡") #查训书名包含"鸡"的图书,不区分大小写
    # books=models.Sites.objects.filter(title__startswith="猴")    #以某个字符开头
    # books = models.Sites.objects.filter(title__endswith="程")    #以某个字符结尾
    # books = models.Sites.objects.filter(pub_date__year=2020)    #查询2020年的记录
    # books = models.Sites.objects.filter(pub_date__month=6)  #查询6月的记录
    books = models.Sites.objects.filter(pub_date__day=10)  #查询10号的记录
    for i in books:
        print(i.title,i.price)
    return HttpResponse("<p>查找成功!</p>")

    3.  删除数据

        1.  删除模型类的对象

            views.py

def delete_book(request):
    books=models.Sites.objects.last().delete()
    return HttpResponse("<p>删除成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
    url(r'distinct_book/', views.distinct_book),
    url(r'delete_book/', views.delete_book),
]

        2.  删除QuerySet类型数据

            返回值:元组,第一个元素为受影响的行数

            views.py

def delete_book(request):
    # books=models.Sites.objects.last().delete()  #直接删除对象
    books=models.Sites.objects.filter(id__in=[1,2]).delete()
    return HttpResponse("<p>删除成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
    url(r'distinct_book/', views.distinct_book),
    url(r'delete_book/', views.delete_book),
]

            结果:  删除id=1或者id=2的记录

              注意:

                1.  Django 删除数据时,会模仿 SQL约束 ON DELETE CASCADE 的行为,也就是删除一个对象时也会删除与它相关联的外键对象。

                2.  delete() 方法是 QuerySet 数据类型的方法,但并不适用于 Manager 本身。也就是想要删除所有数据,不能不写 all。

books=models.Book.objects.delete()  # 报错
books=models.Book.objects.all().delete()   # 删除成功  

    4.  修改数据  

        1.  模型类的对象

            views.py

def update_book(request):
    books=models.Sites.objects.first()
    books.price=600
    books.save()
    return HttpResponse("<p>修改成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
    url(r'distinct_book/', views.distinct_book),
    url(r'delete_book/', views.delete_book),
    url(r'update_book/', views.update_book),
]

            结果:  将第一条数据的price修改为600

        2.  QuerySet类型数据

            返回的结果是整数,受影响的行数

            views.py

def update_book(request):
    # books=models.Sites.objects.first()
    # books.price=600
    # books.save()
    books=models.Sites.objects.filter(pk=3).update(price=888)
    print(books)
    return HttpResponse("<p>修改成功!</p>")

            urls.py

from django.conf.urls import url
from yangjianbo import views
urlpatterns = [
    url(r'^index/(?P<m>[0-9]{2})/$', views.index,name="index"),
    url(r'login1/', views.login, name="login"),
    url(r'add_book/', views.add_book),
    url(r'findall_book/', views.findall_book),
    url(r'filter_book/', views.filter_book),
    url(r'exclude_book/', views.exclude_book),
    url(r'get_book/', views.get_book),
    url(r'order_book/', views.order_book),
    url(r'reverse_book/', views.reverse_book),
    url(r'count_book/', views.count_book),
    url(r'first_book/', views.first_book),
    url(r'last_book/', views.last_book),
    url(r'exists_book/', views.exists_book),
    url(r'values_book/', views.values_book),
    url(r'values_list_book/', views.values_list_book),
    url(r'distinct_book/', views.distinct_book),
    url(r'delete_book/', views.delete_book),
    url(r'update_book/', views.update_book),
]

          结果:  1

                          

  

  

  

    

  

  

    

    

 

    

  

  

              

          

              

                        

                  

      

  

          

        

6.  多表操作  

  

     

                                                    

  

 

  

 

posted @ 2024-05-23 10:57  奋斗史  阅读(23)  评论(0)    收藏  举报