django中save和create的区别
django 一对多的添加记录create 和save 方法,update 更新和save()方法的区别,查询API的方法
查询api的方法:
表.objects.all() ---[obj1,obj2,....]
表.objects.all().first()
表.objects.filter(id=2) ---[obj1,] ,得到一个集合对象,集合里只有一个,跟上first()或者【0】取到一个具体对象
表.objects.get(id=2)---obj,得到一个单独的对象,确定能找到,可以用,如果找到多个或者没有的,都报错。
QuerySet.first(),与get()方法一样,都得到一个对象
QuerySet.last(),与get()方法一样,都得到一个对象
----update 和save方法区别
Book.objects.filter(id=5).update(price=1000) #直接更新update 是QuerySet集合对象的方法,推荐
save方法
book = Book.objects.get(id=5)
book.price=400
book.save()
------value方法,
values(*field),得到一个可迭代的字典序列,不再是一个个对象,而是对象的值,#得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值,
![](/assets/blank.gif)
def query_value(request):b1 = Book.objects.values('title')#title值字段# print(b1) #得到QuerySet集合是所有的记录,,里面是字典,key是字段,value是值,#< QuerySet[{'title': 'Linux'}, {'title': '项塔兰'}, {'title': '追风筝的人'}, {'title': '富爸爸'}] > b2 = Book.objects.values('title','price')#可以加多个字段print(b2)#< QuerySet[{'title': 'Linux', 'price': Decimal('30.00')},# {'title': '项塔兰', 'price': Decimal('45.00')},# {'title': '追风筝的人', 'price': Decimal('39.90')},# {'title': '富爸爸', 'price': Decimal('23.00')}] > b3 = Book.objects.filter(id__gt=4).values('title')#查询id大于4,的title,得到一个对象集合,显示书名#<QuerySet [{'title': '富爸爸'}]>print(b3) return HttpResponse('value 方法的查询方法')
![](/assets/blank.gif)
---
value_list ( ) 得到一个元组格式的数据,只有字段的值,
# ----valuelist 方法查询 ,得到一个元组格式数据,只有字段的值,b4 = Book.objects.filter(id__gt=3).values_list('title')print(b4) #<QuerySet [('追风筝的人',), ('富爸爸',)]>
exclude()方法,
![](/assets/blank.gif)
b5 = Book.objects.exclude(id__gt=3)#exclude 排除 ,查询id大于4的以外的书籍,<QuerySet [<Book: Linux>, <Book: 项塔兰>]> b6 = Book.objects.filter(id__lt=4)# 查询id小于4 的书籍 <QuerySet [<Book: Linux>, <Book: 项塔兰>]>print(b5)print(b6) #b5 和b6 得到结果一样,
![](/assets/blank.gif)
----
其他查询方法
![](/assets/blank.gif)
# <6>order_by(*field): 对查询结果排序# <7>reverse(): 对查询结果反向排序,---需要先排序order_by(*field),才能反转# <8>distinct(): 从返回结果中剔除重复纪录# <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列# <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。# <11>first(): 返回第一条记录# <12>last(): 返回最后一条记录# <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False ---只判断是否有记录
![](/assets/blank.gif)
万能的双下划线:
#---------------了不起的双下划线(__)之单表条件查询----------------
# models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 #
# models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据
# models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # exclude 不包含指定的数据
# models.Tb1.objects.filter(name__contains="ven") #包含的内容
# models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感
# # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and #
# startswith,istartswith, endswith, iendswith,
在url文件中匹配路由和视图函数add
![](/assets/blank.gif)
#mysql 拷贝是不能用,有配置信息, #是要需要修改配置from gu_orm import viewsurlpatterns = [url(r'^admin/', admin.site.urls),url(r'^add/$',views.add), ]
![](/assets/blank.gif)
添加一条记录有2种方法
create方法有2种,save方法
create方法1 :给一对多的关系表中添加数据 ,写死,直接对应数据库的字段添加,是一组组键值对
先给PUblish表添加记录,手动添加,点击 --减号右边 DB 就可以保存,
注意:PUblish表要在book表上面,因为生成表的时候,book表有PUblish_id的字段,所以会先找到PUblish表,然后在book中添加对应的id号,要不报错
在model里创建表,
book与PUblish是一对多的关系,一个出版社可以出版多种书,外键就要建在多的表中,
![](/assets/blank.gif)
from django.db import models# Create your models here. class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=5 , decimal_places=2)#书籍与出版社是一对多,书是多,出版社是一,外键(子表)建在多的表中,#publish 作为一个外键 与Book 表建立一对多关系,默认绑定到Book 的主键id上publish = models.ForeignKey(Publish,)#一对多的增删改查,#做增加 #先给一 的表添加数据,才能在对应的多 的表增加数据,要不Publish_id 没有值,
![](/assets/blank.gif)
在views文件中
先导入从model 已经创键的表Book表, 给book表增加数据,
Book.objects.cteate(),用create方法创建表,
数据库的字段对应要添加值,然后运行项目,
![](/assets/blank.gif)
from django.shortcuts import render,HttpResponse# Create your views here.from gu_orm.models import * -----从models表中导入所有的表,def add(request):#添加一条book记录 Book.objects.create( title = '千城之城',price = 11.90,publish_id = 1#以数据库的字段为准, )return HttpResponse('ok')
![](/assets/blank.gif)
此时就可以看到数据库book表中就有了一条记录,并且对应着一条PUblish的记录
=====
获取对象的具体值,单个对象字段属性
#从数据库获取一条记录,book_obj = Book.objects.get(id=1)print(book_obj.title)print(book_obj.price)
运行项目,得到结果,,,
千城之城 11.90
现在打印book表中一个外键的字段PUblish
print(book_obj.publish) ------Publish object 得到一个对象,是PUblish表中的一条记录,对应书中的一条记录,,是一个对象,因为是一对多的关系
要想显示外键的具体的值,就在PUblish表加上__str__(self):,就会显示具体的值,而不再是对象
如下,
![](/assets/blank.gif)
class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=32)#有了__str__()方法,就可以看到对象具体的值,没有它 ,打印对象,就是一个对象,# 当用到PUblish表中字段的时候,# 就可以看到对象具体的值,而不再是一个看不懂的对象,def __str__(self):return self.name
![](/assets/blank.gif)
此时再打印book表的外键,
![](/assets/blank.gif)
#打印外键字段publishprint(book_obj.publish) ---北京出版社#Publish object 得到一个对象,是 publsih表中对应的一条记录也就是一个对象,#看不到具体的值,想看到对象具体的值,就用 __str__()方法,所以在models里#就可以用__str__(),就可以看到外键的具体值,而不再是一个对象,
![](/assets/blank.gif)
---所以在每个表中,都可以使用__str__(self)方法,显示对象的具体的值
要想显示多个值也可以,用+ 号,记得空开距离
def __str__(self):return self.name +" "+self.addr
create方法2 :给一对多的关系表中添加数据
先创建一个PUblish对象
#方法2,先找到一个出版社对象publish_obj = Publish.objects.get(id=2)
然后再用create方法,把publish_obj对象给publish表
![](/assets/blank.gif)
#创建book对象, Book.objects.create(title = '项塔兰',price = 23.50,publish = publish_obj,)
![](/assets/blank.gif)
运行程序,重新访问视图函数add,url地址栏重新访问add,数据库就了新添加的记录
添加记录方法2,
=====save方法
![](/assets/blank.gif)
#save 方法,用实例出来的对象保存# 一对多,p = Publish(name='人民出版社',addr='昌平')p.save()#把对象保存到数据库#与PUblish表添加一个对象,既一条记录book = Book(title = '追风筝的孩子',price = '15.00',publish = p)#与PUblish的publish_id绑定一个存在的记录,既对象book = Book(title = '追风筝的孩子',price = '15.00',publish_id = 3)book.save() #保存到数据库
django中save和create的区别相关推荐
- npm 中 --save 与 --save-dev 的区别
前言 在使用 npm 安装模块包的时候使用 npm install 模块名称 命令.但通常后面会加上 --save 或者 --save-dev,那么这两个命令有什么区别昵?以下是四种安装方式.以 we ...
- Django中filer和get的区别
上面的例子中`` filter()`` 函数返回一个记录集,这个记录集是一个列表. 相对列表来说,有些时候我们更需要获取单个的对象, `` get()`` 方法就是在此时使用的: >>&g ...
- Django中HttpResponse和JsonResponse的区别和用法
1.HttpResponse的用法 a.HttpResponse第一个参数为字符串类型(需要返回到前端的字符串数据) b.content_type可以指定响应头中的content_type类型 c.s ...
- django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066
django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066 1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate( ...
- Django中ORM的具体使用,超全超长超好懂
一.django字段和字段参数介绍 class Book(models.Model):# 如果不写id,会默认一个id,并且自增#primary_key=True 表示该字段是主键,一个表中只能由一个 ...
- django官方文档——django中的用户认证
Django 中的用户认证¶ Django 自带一个用户认证系统,这个系统处理用户帐户.组.权限和基于 cookie 的会话.本文说明这个系统是如何工作的. 概览¶ 认证系统由以下部分组成: 用户 权 ...
- Django中Model模块的操作-创建各种表结构(上)
Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLd ...
- Django中Mysql数据库的使用
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作. 使用django进行数据库开发的步骤如下: 配置数据库连接信息 在配置文件中注册 ...
- 在django中区分null = True,空白= True
当我们在Django中添加数据库字段时,通常会编写models.CharField(max_length=100, null=True, blank=True) . 对ForeignKey , Dec ...
最新文章
- 2010中国城市GDP排名
- iKair:放弃硬件制造,切入上游去“送水”的逻辑
- 开源工具高效分析Java应用
- 深度 | AI掘金,非富即亡
- docker 安装nacos_「Java Spring Cloud 实战之路」 使用nacos配置网关
- 量化金融模型的基本Roadmap
- Graphpad Prism 9绘制子列图与柱状图
- JavaScript——String转DOM对象解决方案
- android bitmap drawable 互转
- JSON在Android网络交互中的使用方法
- openstack 教程_OpenStack的新提示,技巧和教程
- android居中不父布局,在父级中,TextView不会垂直居中_android_开发99编程知识库
- 关于Oracle的提示详解(1)
- 记录ubuntu18.04安装QQ过程
- iOS开发——AVPlayer自定义播放器(持续更新,学习中)
- 架构师必备!java架构师资格证书
- 计算机上显示找不到无线网络连接,电脑怎么找不到无线网络? 笔记本找不到无线网络如何解决?...
- linux mint 环境配置jimi
- 编写计算机程序的几个步骤,第1讲程序设计的一般步骤ok.doc
- c++内存释放的几种方法