Django的models操作
一、先看单表操作
增
方式1:
models.book.objects.create(
Book_name = "aaa",
Book_info = "bbb",
Book_price = "ccc",
Book_num = "ddd"
)
方式2:用2个*号传递一个字典进去
book_info = {
"Book_name":"aaa",
"Book_info":"bbb",
"Book_price":"ccc",
"Book_num":"ddd"
} models.book.objects.create(**book_info)
删,通过delete方法
可以通过表中的每个字段进行删除
models.book.objects.filter(id=1).delete() models.book.objects.filter(Book_name="book1").delete()
改,通过update方法,要 调用update方法,必须要querySet对象才可以,比如filter和all方法返回的是一个对象集合,通过get方法返回的单个对象是不能调用update方法的
models.book.objects.filter(id=1).update(
Book_name = "aaa",
Book_info = "bbb",
Book_price = "ccc",
Book_num = "dd"
)
models.book.objects.filter(Book_name="book6").update(Book_name="aaaaaaaaaaaaaaaa")
查
get方法:返回单个对象
models.book.objects.all().get(id=2)
filter方法:返回一个对象集合
models.book.objects.filter(id=1)
values方法:返回一个对象集合的字典形式,也可以只返回指定的字段
models.book.objects.filter(id=1).values("Book_name","Book_info")
print(models.book.objects.all().values())
values_list方法:返回一个对象集合的列表的形式
print(models.book.objects.all().values_list())
count方法:统计数据的个数
print(models.book.objects.filter(Book_name="book3").count())
exists方法:统计对象集合中是否有数据,有则为ture,无则为false
print(models.book.objects.filter(Book_name="book3").count())
exclude:返回不符合某个条件的对象集合
models.book.objects.exclude(id=2)
order_by:按照指定的字段从小到大排列
models.book.objects.order_by("Book_price")
order_by:按照指定的字段从大到小排列
models.book.objects.order_by("-Book_price")
reverse:和orader_by加一个符号的效果一样,逆序排列
models.book.objects.reverse("id")
distanct:对结果去重,这里不能对单个字段去重,只能对所有的字段去重
models.book.objects.all().distinct()
二、在看一对多操作
一对多和一对一基本上一样,只有插入数据这里有点不一样
# 先看一对多
# 我们先看下ForeignKey这个字段的值该如何插入
# 虽然我们写的的Book_pub,但是实际上在数据库中存储的字段是Book_pub_id,所以这里有两种方式来搞 # 如果我们知道书对应的出版社的id,则可以直接用Book_pub_id赋值这个数字就可以了
# Book_pub_id = 4
# # 我们还可以直接从数据库取出出版社的对象,然后Book_pub赋值给一个出版社的对象就可以了
# Book_pub = Publish的对象
另外一点不一样的就是,如果在一所对应的表中删除数据,那么会同步删除多表中的包含该一的字段
比如书1的出版社是出版社1,书2的出版社是出版社1,那么如果我们在出版社表中删除出版社1,那么不仅仅出版社表中的出版社1的数据会被删除,书表中的书1和书2都会被同步删除
我们看下一对多如何增加数据
因为书和出版社是一对多的关系,我们先获取一个出版社对象
publish_obj = models.Publish.objects.filter(id=5)[0] models.book.objects.create(
Book_name = "django",
Book_info = "这是一本写django的书",
Book_price = 100,
Book_num = 20000,
Book_pub = publish_obj
)
或者直接赋值id
models.book.objects.create(
Book_name = "Flask",
Book_info = "这是一本写Flask的书",
Book_price = 100,
Book_num = 20000,
Book_pub_id = 5
)
我们查看数据库,已经创建了2条数据
下面我们看下一对多的删除
我们先删除出版社id为5的数据,看下有什么效果
models.Publish.objects.filter(id=5).delete()
我们发现Publish中id为5的数据已经被删除
同样在book表中,关联publish表中id为5的数据也被删除
我们在看下删除book表中的数据
models.book.objects.filter(id=8).delete()
我们看到数据库中已经删除这条数据
我们在看改
我们在创建两条数据
先把book表中的数据更新
models.book.objects.filter(id=14).update(Book_name="python教程")
我们查看数据库发现名称已经更改
我们在来尝试下修改publish_id
models.book.objects.filter(id=14).update(Book_pub_id=1)
我们在来看数据库
发现已经更改
我们最后来看下查
首先我们看正向查询,正向查询的意思就在有外键的表查询
通过all方法查看
obj = models.book.objects.all()
print(obj)
结果如下
查看某条数据的信息
obj = models.book.objects.filter(id=13)[0]
print(obj.Book_Auther)
print(obj.Book_pub)
print(obj.Book_pub_id)
结果如下
我们还可以通过两个下划线做跨表查询
obj = models.book.objects.all().values("Book_name","id","Book_pub__id","Book_pub__Pub_name")
print(obj) obj = models.book.objects.all().values_list("Book_name","id","Book_pub__id","Book_pub__Pub_name")
print(obj)
结果如下
我们在来看逆向查询,通过没有外键的表查询
1、先拿到一个对象,记住,这里不能使用对象集合,下面的例子,第一个obj是一个错误的示范
obj = models.Auther.objects.filter(id=1)
obj = models.Auther.objects.get(id=1)
2、通过set方法查询,记住values里面的字段和正向查询是一样的
obj = models.Auther.objects.get(id=1)
#
#
print(obj.book_set.values("Book_name","Book_pub__Pub_name"))
我们看结果
我们可以查询某个出版社出版了几本书
obj = models.Publish.objects.filter(id=1)[0] print(obj.book_set.all().count())
我们可以查看某个出版社出版的书的名称
obj = models.Publish.objects.filter(id=1)[0] print(obj.book_set.all().count()) print(obj.book_set.all().values("Book_name"))
三、再看多对多操作
先看怎么创建多对多的关系
方式1,由django为我们创建第三张表
Book_Auther = models.ManyToManyField("Auther")
add方法
book = models.book.objects.filter(id=1)[0] auther1 = models.Auther.objects.filter(id=1)[0]
auther2 = models.Auther.objects.get(id=2) book.Book_Auther.add(auther1,auther2)
结果
remove方法
book = models.book.objects.filter(id=1)[0] auther1 = models.Auther.objects.filter(id=1)[0]
auther2 = models.Auther.objects.get(id=2) # book.Book_Auther.add(auther1,auther2) book.Book_Auther.remove(auther1)
结果
我们在看反向添加,在没有manytomanyfiled的表出发去执行命令,需要一个_set方法
book1 = models.book.objects.filter(id=1)[0]
book2 = models.book.objects.get(id=2) auther2 = models.Auther.objects.get(id=2) auther2.book_set.add(book1,book2)
结果
在看反向移除,也要用到_set方法
book1 = models.book.objects.filter(id=1)[0]
book2 = models.book.objects.get(id=2) auther2 = models.Auther.objects.get(id=2) # auther2.book_set.add(book1,book2)
auther2.book_set.remove(book1)
结果如下
方式2、我们自己创建第三张表
class BookToAuther(models.Model):
book = models.ForeignKey("book")
auther = models.ForeignKey("Auther")
在看如何为多对多表中插入数据,我们先看下第三张表由django为我们创建的表的情况
为一个书添加多个作者
# 获取一个书的对象
book_obj = models.book.objects.filter(id=1)[0] # 获取2个作者的对象
auther1 = models.Auther.objects.filter(id=1)[0]
auther2 = models.Auther.objects.all().get(id=2) # 为这个书添加2个作者对象
book_obj.Book_Auther.add(auther1,auther2) # 为这个书添加2个对象的另外一种方式
book_obj.Book_Auther.add(*[auther1,auther2
把add换成remove就是解除绑定
反向查询这里,book是小写的,就算你的book表是大写的,这里也要变为小写
多对多,如果我们自己创建第三张表,那么就在第三表中对book和auther都写上外键,就相当于一个多对多,那么我们操作第三张表和一对多是一样的
# 第二种方式创建多对多的第三张表class BookToAuther(models.Model):
class BookToAuther(models.Model):
book = models.ForeignKey("book")
auther = models.ForeignKey("Auther")
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我们在来看下查询的其他方法
1、切片操作
obj = models.book.objects.all()[0:1]
print(obj) obj = models.book.objects.all()[0:10:2]
print(obj)
结果如下
2、拿到指定书名对应的出版社的名称
# 先拿到书的对象,然后根据外键就获取一表中的对象,然后根据这个对象就可以获取另外一张表的的字段的信息
obj = models.book.objects.filter(Book_name="shu2")[0].Book_pub.Pub_name
print(obj)
结果
3、拿到某个出版社出版的所有书的名称,book_set返回的是一个query_set对象
# 先拿到出版社的对象,然后通过book_set方法拿到书这个表的内容,然后通过values方法去获取指定的字段
obj = models.Publish.objects.filter(Pub_name="chubanshe4")[0].book_set.all().values("Book_name")
print(obj) obj = models.Publish.objects.filter(Pub_name="chubanshe4")[0].book_set.all().values_list("Book_name")
print(obj)
结果
4、拿到id大于2的书的名称和id
# 查询id大于2的书的名称
obj = models.book.objects.filter(id__gt=2)
print(obj.values("id","Book_name"))
结果如下
5、其他一些双下划线的单表查询的方法
# 小于
obj = models.book.objects.filter(id__lt=2) # 大于等于
obj = models.book.objects.filter(id__gte=2) # 小于等于
obj = models.book.objects.filter(id__lte=2) obj = models.book.objects.filter(id__in=[1,2,4,6]) # 包含,区分大小写
obj = models.book.objects.filter(Book_name__contains="chuban") # 包含,不区分大小写
obj = models.book.objects.filter(Book_name__icontains="chuban") # 以什么开头,区分大小写
obj = models.book.objects.filter(Book_name__startwith="chuban") # 以什么开头,不区分大小写
obj = models.book.objects.filter(Book_name__istartwith="chuban") # 以什么结尾,区分大小写
obj = models.book.objects.filter(Book_name__endwith="chuban") # 以什么结尾,不区分大小写
obj = models.book.objects.filter(Book_name__iendwith="chuban")
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
关联查询
1、查询书的名称是shu0的出版社的信息,要求是通过出版社这张表去查,这个意思book表中的 book_name字段,因为出版社中没有外键,则只能通过表名去做跨表查询
obj = models.Publish.objects.filter(book__Book_name="shu0")
print(obj.all())
fiilter中可以有多个过滤的字段,这些过滤的字段通过逗号隔开,这几个字段是取交集的
2、我们还可以通过书的表去查询出版社的信息,那么这里就不能用表明,而是用在书中的外键的字段,因为书的表中有外键,所有要用外键的字段去做跨表查询
obj = models.book.objects.filter(Book_pub__Pub_name="chubanshe1")
print(obj.all())
补充一个小点,model的form验证
我们在models中创建表,可以选择CharField,也可以选择EmailField,但是如果我们选择了EmailField,就算我们输入的不是邮箱格式,我们也可以正常插入数据,那么是不是这个字段没有作用呢?
我们先看下例子吧
1、在model创建表
class test(models.Model):
u = models.CharField(max_length=64,null=True)
e = models.EmailField(max_length=12,null=True)
2、然后我们插入数据
2_1、create方法插入数据
models.test.objects.create(u="aaaa",e="111111")
可以插入成功
2_2、save方法插入数据
obj = models.test()
obj.u = "2222"
obj.e = "22222"
obj.save()
可以插入成功
看起来这个EmailField确实没有什么作用,其实不然,如果我们这样搞的话,他就会校验数据的合法性,使用clear_fields方法,就可以校验合法性
obj = models.test()
obj.u = "3333"
obj.e = "3333"
res = obj.clean_fields()
print(res)
obj.save()
我们看到后台报错了
数据库中也没有插入数据
如果我们输入正确的邮箱格式,则可以添加成功
obj = models.test(u="33333",e="33333@qq.com")
res = obj.clean_fields()
print(res)
obj.save()
数据库也插入数据成功
先简单的介绍下model的forms,就到此为止吧
Django的models操作的更多相关文章
- Django ORM models操作
title: Django ORM models操作 tags: Django --- Django ORM models操作 Django ORM基本操作 一.数据库的创建及增删改查 1 使用类创建 ...
- Django之Models操作
一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...
- Django 补充models操作,中间件, 缓存,信号,分页
1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...
- 不在框架中,利用Django的models操作
import os import sys import django sys.path.apprnd(r'路径') os.chdir(r'路径') os.environ.setdefault('DJA ...
- Django models 操作高级补充
Django models 操作高级补充 字段参数补充: 外键 约束取消 ..... ORM中原生SQL写法: raw connection extra
- Django详解之models操作
D jango 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.p ...
- Django之Models进阶操作(字段属性)
字段属性详细介绍 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列, ...
- Django之Models与ORM操作
一.models例子 from django.db import models class User(models.Model): """ 用户表 "" ...
- 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化
第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...
随机推荐
- [UE4]ue4 FString 中文乱码问题
使用FString出现乱码,最简单的情况,FString Str = "你好"; 这时候就会出现乱码,解决方法是改成这样 FString Str = TEXT("你好&q ...
- 提示ORA-01144: File size (13107200 blocks) exceeds maximum of 4194303 blocks 最大4194303 block(转)
并不是100g的表空间,是100g的数据文件.一般情况下,单个数据文件的最大为32g.解决方法:1.创建多个数据文件,都不能超过32g2.创建大表空间.create bigfile tablespac ...
- java实现远程控制
屏幕监控: Robot robot = new Robot();Dimension d = Toolkit.getDefaultToolkit().getScreenSize();image = ro ...
- lambda,sorted(),filter(),map(),递归,二分法
1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作例 # li=['21','asdd','weqeqw','wqf']# # it=iter(li)# # prin ...
- selenium+python自动化96-执行jquery报:$ is not defined
前言 背景介绍:做wap页面自动化的时候,把url地址直接输入到浏览器(chrome浏览器有手机wap模式)上测试,有个按钮死活点不到,用wap模式的触摸事件也无法解决,后来想用jquery去执行点击 ...
- uva-10050-模拟水题
一个社会研究组织决定通过一组简单的参数来模拟国家政党的行为.第一个参数一个正整数h(叫做罢工参数),用于指示在对应的政党在俩个连续休假之间的平均天数.虽然这个参数太简单了,它不是最完美的参数.但是它还 ...
- spring boot 整合MongoDB
参考 https://www.cnblogs.com/nbfujx/p/7999171.html
- VisualSVN: 只能修改自己提交日志
上回讲过怎么修改日志信息,这次想提交怎么只能修改自己提交的. 现在演示用户111来修改libra的日志信息 这个公正的SVN出现了 用户111说小样,不让我改,那我修改自己提交的日志总行了吧!! 我改 ...
- word 2013 自动保存太慢,下面读条起码3分钟
该问题有可能是应用干扰或者安全设置问题导致的. 建议您尝试以下方法: 方法一: 尝试使用干净启动来暂时禁用计算机启动时所加载的第三方程序来进一步做测试: 如何在Windows 中执行干净启动步骤 具体 ...
- setlocal 与 变量延迟
setlocal 与 变量延迟 本条内容引用[英雄出品]的批处理教程: 要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看. 为了更好的说明问题,我们先引入一个例子.例1: @echo off ...