ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django ORM-单表实例重点

2020-08-12 16:33:00  阅读:221  来源: 互联网

标签:__ objects models price ORM Django Book books 单表


首先创建一app01的项目

django-admin.py startproject app01

接下来在settings.py中找到INSTALLED_APPS这一项,如下:

INSTALLED_APPS =(
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01', 添加初始
)

接下来,告诉Django使用pymysql模块连接mysql数据库:

__int__.py文件
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()

创建模型

在项目中的models.py中添加以下类:

models.py文件

class Book(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()  出版时间

然后在命令行执行以下命令:

python manage.py migrate 创建表结构

python manage.py makemigrations app01 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate app01     创建表结构

数据库添加

规则配置:

app01/urls.py: 文件代码:

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

views.py文件代码 !!!!!!数据库添加from django.shortcuts import render,HttpResponsefrom app01 import models

def add_book(request):

数据库添加
方法一
book = models.Book(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8")
book.save()
return HttpResponse("<p>数据添加成功!</p>")

方法二
books = models.Book.objects.create(title="如来神掌5", price=200, publish="功夫出版社", pub_date="2010-10-10")

return HttpResponse("<p>数据添加成功!</p>")

查找
使用 all() 方法来查询所有内容。
返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。
books = models.Book.objects.all()
for i in books:
print(i.title)
QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
return HttpResponse("<p>查找成功!</p>")

1、根据条件查询
filter() 方法用于查询符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。
pk=3 的意思是主键 primary key=3,相当于 id=3。
因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
books = models.Book.objects.filter(pk=5)

print("//////////////////////////////////////")
books = models.Book.objects.filter(publish='菜鸟出版社', price=300)
print(books ) QuerySet类型,类似于list。
return HttpResponse("<p>查找成功!</p>")

2、exclude() 方法用于查询不符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是不满足条件的模型类的对象,可用索引下标取出模型类的对象。
books = models.Book.objects.exclude(pk=5)

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

3、get() 方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,
如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
books = models.Book.objects.get(pk=5)
books = models.Book.objects.get(pk=18) 报错,没有符合条件的对象
books = models.Book.objects.get(price=200) 报错,符合条件的对象超过一个

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

4、order_by() 方法用于对查询结果进行排序。
返回的是 QuerySet类型数据,类似于list,里面放的是排序后的模型类的对象,可用索引下标取出模型类的对象。
注意:
a、参数的字段名要加引号。
b、降序为在字段前面加个负号 -。
books = models.Book.objects.order_by("price") 查询所有,按照价格升序排列
books = models.Book.objects.order_by("-price") 查询所有,按照价格降序排列
return HttpResponse("<p>查找成功!</p>")

5、reverse() 方法用于对查询结果进行反转。
返回的是 QuerySe t类型数据,类似于 list,里面放的是反转后的模型类的对象,可用索引下标取出模型类的对象。
按照价格升序排列:降序再反转 从小到大
books = models.Book.objects.order_by("-price").reverse()
return HttpResponse("<p>查找成功!</p>")

6、count() 方法用于查询数据的数量返回的数据是整数。
books = models.Book.objects.count() 查询所有数据的数量
books = models.Book.objects.filter(price=200).count() 查询符合条件数据的数量
return HttpResponse("<p>查找成功!</p>")

7、first() 方法返回第一条数据返回的数据是模型类的对象也可以用索引下标 [0]。
books = models.Book.objects.first() 返回所有数据的第一条数据
return HttpResponse("<p>查找成功!</p>")

8、last() 方法返回最后一条数据返回的数据是模型类的对象不能用索引下标 [-1],ORM 没有逆序索引。
books = models.Book.objects.last() 返回所有数据的最后一条数据
return HttpResponse("<p>查找成功!</p>")

9、exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。
返回的数据类型是布尔,有为 true,没有为 false。
注意:判断的数据类型只能为 QuerySet 类型数据,不能为整型和模型类的对象。
books = models.Book.objects.exists()
books = models.Book.objects.count().exists() 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
  books = models.Book.objects.first().exists()报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
  return HttpResponse("<p>查找成功!</p>")
  10、values() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个可迭代的字典序列,字典里的键是字段,值是数据。
注意:
参数的字段名要加引号
想要字段名和数据用 values
查询所有的id字段和price字段的数据
books = models.Book.objects.values("pk", "price")
print(books[0]["price"]) 得到的是第一条记录的price字段的数据
for i in books:
print(i["price"]) 得到所有的价格
return HttpResponse("<p>查找成功!</p>")

11、values_list() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个个元组,元组里放的是查询字段对应的数据。
注意:
参数的字段名要加引号
只想要数据用 values_list
查询所有的price字段和publish字段的数据
books = models.Book.objects.values_list("price", "publish")
print(books[0])
return HttpResponse("<p>查找成功!</p>")

12、distinct() 方法用于对数据进行去重。
返回的是 QuerySet 类型数据。
注意:
对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
distinct() 一般是联合 values 或者 values_list 使用。
查询一共有多少个出版社
books = models.Book.objects.values_list("publish").distinct() 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
books = models.Book.objects.distinct()
return HttpResponse("<p>查找成功!</p>")

13、filter() 方法基于双下划线的模糊查询(exclude 同理)。
注意:filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号。
__in 用于读取区间,= 号后面为列表 。
查询价格为200或者300的数据
books = models.Book.objects.filter(price__in=[200, 300])

__gt 大于号 ,= 号后面为数字。
查询价格大于200的数据
books = models.Book.objects.filter(price__gt=200)

__gte 大于等于,= 号后面为数字。
查询价格大于等于200的数据
books = models.Book.objects.filter(price__gte=200)

__lt 小于,=号后面为数字。
查询价格小于300的数据
books = models.Book.objects.filter(price__lt=300)

__lte 小于等于,= 号后面为数字。
查询价格小于等于300的数据
books = models.Book.objects.filter(price__lte=300)

__range 在 ... 之间,左闭右闭区间,= 号后面为两个元素的列表。
查询价格在200, 300之间的数据
books = models.Book.objects.filter(price__range=[200, 300])

__contains 包含,= 号后面为字符串。
查询包含 菜 的数据
books = models.Book.objects.filter(title__contains="菜")

__icontains 不区分大小写的包含,= 号后面为字符串。
books = models.Book.objects.filter(title__icontains="python") 不区分大小写

__startswith 以指定字符开头,= 号后面为字符串。
books = models.Book.objects.filter(title__startswith="菜")

__endswith 以指定字符结尾,= 号后面为字符串。
books = models.Book.objects.filter(title__endswith="教程")

__year 是 DateField 数据类型的年份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__year=2008)

__month 是DateField 数据类型的月份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__month=10)

__day 是DateField 数据类型的天数,= 号后面为数字。
books=models.Book.objects.filter(pub_date__day=10)
return HttpResponse("<p>查找成功!</p>")

14、删除
方式一:使用模型类的 对象.delete()。
返回值:元组,第一个元素为受影响的行数。
注意:
a. Django 删除数据时,会模仿 SQL约束 ON DELETE CASCADE 的行为,也就是删除一个对象时也会删除与它相关联的外键对象。
b. delete() 方法是 QuerySet 数据类型的方法,但并不适用于 Manager 本身。也就是想要删除所有数据,不能不写 all。
books=models.Book.objects.delete()  报错
books=models.Book.objects.all().delete()   删除成功
books = models.Book.objects.filter(pk=6).first().delete()
方式二:使用 QuerySet 类型数据.delete()(推荐)
返回值:元组,第一个元素为受影响的行数。
books = models.Book.objects.filter(pk__in=[5]).delete()
return HttpResponse("<p>删除成功!</p>")

15、修改
方式一:
模型类的对象.属性 = 更改的属性值
模型类的对象.save()
返回值:编辑的模型类的对象。
books = models.Book.objects.filter(pk=4).first()
books.price = 400
books.save()
方式二:QuerySet 类型数据.update(字段名=更改的数据)(推荐)
返回值:整数,受影响的行数
books = models.Book.objects.filter(pk__in=[2,3]).update(price=888)
return HttpResponse("<p>修改成功!</p>")

 

标签:__,objects,models,price,ORM,Django,Book,books,单表
来源: https://www.cnblogs.com/xf2764/p/13491319.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有