orm读取和操作数据_orm-sea columnref-程序员宅基地

技术标签: # model层数据库  java  前端  javascript  

 如下:定义一个 1对多 关系:

# 国家表
class Country(models.Model):
    name = models.CharField(max_length=100)

# 学生表, country 字段是国家表的外键,形成一对多的关系
class Student(models.Model):
    name    = models.CharField(max_length=100)
    grade   = models.PositiveSmallIntegerField()
    country = models.ForeignKey(Country,
                                on_delete=models.PROTECT)

创建方式:

方式1:

        obj= 类(name=”“)

        obj.save()
类实例化后, 然后用save,实际上就执行了sql,可以用 connection.queries 查看到

connction 是django 连接数据库时的一个东西

查询的时候要 导入才能用

from django.db import connection  补充:查看实际sql

 方式2:

        用objects的create方法,其中自动去save了

         类.objects.create(name='中国')

from common.models import *
c1 = Country.objects.create(name='中国')
c2 = Country.objects.create(name='美国')
c3 = Country.objects.create(name='法国')
Student.objects.create(name='白月', grade=1, country=c1)
Student.objects.create(name='黑羽', grade=2, country=c1)
Student.objects.create(name='大罗', grade=1, country=c1)
Student.objects.create(name='真佛', grade=2, country=c1)
Student.objects.create(name='Mike', grade=1, country=c2)
Student.objects.create(name='Gus',  grade=1, country=c2)
Student.objects.create(name='White', grade=2, country=c2)
Student.objects.create(name='Napolen', grade=2, country=c3)

小小的补充创建子表的两种方式(知道就行):

        第一种:如上,创建Student表

        第二种:可以这么写:Student.objects.create(name='白月', grade=1, country_id=c1_id)

1.查询:

查询结果为多个的QuerySet列表形式

QuerySet对象的特性:

        支持链式调用

        惰性查询,仅仅在使用时才执行sql语句,如:len(), count(),  通过切片

对象列表

返回的是QuerySet列表的形式(仅数据对象)

Country.objects.all()

结果为:<QuerySet [<Country: Country object (1)>, <Country: Country object (2)>, <Country: Country object (3)>]>   

筛选数据:如果筛不出来就返回空的QuerySet列表  

Country.objects.filter(name="中国",id="1")         # 筛选方式1   且的关系 Country.objects.filter(name="中国").filter(id=1)   # 筛选方式2           

小技巧:

  如果id是 主键,可以写成 pk=* 对于查询级列表,

  可以像列表一样切片,  

  可以.first() .last() 最后一个 .count() 列表数量 .exists() 是否存在  .ordey_by排序详细看后面 

  可以进行 for 循环

含数据的列表 

返回的是QuerySet列表的形式(所有数据及所有字段)
   Country.objects.values()
   格式:
 <QuerySet [{'id': 1, 'name': '中国'}, {'id': 2, 'name': '美国'}, {'id': 3, 'name': '法国'}]>
   筛选展示如 Country.objects.values("name")
则结果为:<QuerySet [{'name': '中国'}, {'name': '美国'}, {'name': '法国'}]>
   筛选数据(类似where条件):Country.objects.values("name").filter(name="法国")
则结果为:<QuerySet [{'name': '法国'}]>


如下,可以这样把数据库的数据展示再页面上

补充:QuerySet API reference | Django documentation | Django

从官网中看到, Country.objects ,后面还可以加  value_list() 等等

[(字段数据1,字段数据2),(),()]

aggregate()  ,聚合运算

固定搭配:values  和  annotate  ,  分组父表的id,然后查询每个id的从表数据有多少个。

 用 value_list时,可以加flat=True的参数,但只能指定一个字段

 具体的对象

返回具体的对象:

类.objects.all()[0]     # 第一个

类.objects.all().first()   # 第一个

get方式根据字段查询:

Country.objects.get(id=1)

Country.objects.get(name="美国")        

 如果:查不到、或者查出来有多个,都会抛出异常, 所以最好使用有唯一约束的条件去查询下

查询的方式

QuerySet查询集列表的 过滤 查询类型

Country.objects.filter()   filter中的查询类型

 常用的:

        id__gt = 5   表示 大于5    注: id后面要默认带出关键字才能用(自定义的id好像才能用)
        id__lt = 5        小于5
        id__gte = 5  表示 大于等于5
        id__lte=5         小于等于5
        id__in=[1,2,5]

        name__exact="中国"         补充: name=“中国” 默认就是name__exact

       name__iexact="Abc"        全匹配,并忽略大小写


        name__contains='美'     包含
        name__icontains='x'        包含 忽略大小写


        name__startswith='中'    以中开头的
        name__icontains='x'

        name__endswith='国'        以国结束的
        name__iendswith='国'

补充===   filter()   的反义 用  exclude()  ,

        如   exclude(   name__contains='美' ) ,表示不包含 美   的数据

官网-model 中的 querySet 的  lookups:QuerySet API reference | Django documentation | Django

还有

        如:  __range =(开始时间,结束时间)

                __regex =r"^(An?|The) +"                --正则


外键字段用法补充:

如国家--人   一对多案例

学生表中有个country 字段,可以些country__国家表的字段,如

country__name

以上是两表查询,实际上还有多表查询(没试过)

外键表字段+ 查询条件,  如下:

list3=Student2.objects.filter(grade=1,country__name__icontains='国')
for i in list3:
    print(i.name)

多张表的查询举例:

关联方式总结:

 country__name    表示国家表的名字字段,  查学生用  Student2.objects.filter(条件)( 例3)

 students__grade  表示学生的grade字段。    查国家用 Country.objects.filter(条件)(  例4 )

 stu1.country           一学生属于哪个国家              (例1)

 c1.students            一个国家下的学生们             (例2)

------------------------1.已知一个学生,查其国家------------------------------------------------

查看某个学生,属于哪个国家,同上面的a
        s1 = Student.objects.get(name='白月') 
        s1.country.name

-------- 2.已知一个国家,查有哪些学生属于这个国家------------定义 related_name ,就能反向查询-

如:此列子是反向查询所有

例子4:是反向查询,并且过滤每个字段

方式1:
        cn = Country.objects.get(name='中国') 
        cn.student_set.all()    结果同Students.object.all()    的查询集列表
通过表Model名转化为小写 ,后面加上一个 _set, 来获取所有的反向外键关联对象

方式2:定义外键时:用related_name,指反向查询时用什么名字:        
       可以想象成。 给Country表增加了一个东西 叫 students。 某个国家.students  来使用

                cn.students .all()

class Student2(models.Model):
    name    = models.CharField(max_length=100)
    grade   = models.PositiveSmallIntegerField()
    country = models.ForeignKey(Country,
                                on_delete=models.PROTECT,
                                # 指定反向访问的名字
                                related_name='students'
                                )

------------------------  3.查子表-学生们,条件有学习的字段   、国家的字段。(关联查询)-------------

查看学生,一年级 且 国家为中国的(快捷写法,外键__外键表的字段名)         Student.objects.filter(grade=1,country__name='中国').values()

如果返回结果只需要 学生姓名外键表的国家名两个字段,可以这样指定values内容

Student.objects.filter(grade=1,country__name='中国') .values('name','country__name')

另命名:如下代码

from django.db.models import F

# annotate 可以将表字段进行别名处理
Student.objects.annotate(
    countryname=F('country__name'),
    studentname=F('name')
    )\
    .filter(grade=1,countryname='中国').values('studentname','countryname')

------------------------  4.查父表-国家表,条件为学生的字段---------(关联查询)----------------------------

Country.objects.filter(students__grade=1).values().distinct()

或:Country.objects.filter(students__name__contains="月")

students为上面讲的定义的related_name

注意:据说 .distinct()对MySQL数据库无效,我没有来得及验证。实测 SQLite,Postgresql有效。

逻辑关系

且关系:

一个filter中写多个条件,中间用逗号隔开,或者,链式调用,连续的filter   就是and关系

         如上的例子3就是且的关系。

  Student.objects.filter(grade=1,country__name='中国')

或者  Student.objects.filter(grade=1).filter(country__name='中国')

或关系:

from django.db.models import Q
qs = Student2.objects.filter(Q(name__contains="白") | Q(grade="1"))

查询集的排序:
Country.objects.all().order_by("name")  # 默认升序

# 降序的写法

        Country.objects.all().order_by("-name")        

# 多个字段排序的时候

        Student2.objects.all().order_by("-grade","name")

更新

更新一条数据,  直接改,然后save()一下

c1.name="新中国"

c1.save()

或者指定:要更新哪些字段   c1.save(update_fields=["name"])

批量更新多条数据、使用update方法 无需调用svae

Student2.objects.filter(name__contains="白").update(grade=4)

删除

使用delete()方法

c1.delete()

删除多条数据,也是用delete()方法

qurrset查询.delete()

如  Student2.objects.filter(name__contains="白").delete()

        #测试后,补上数据。

       c1 = Country.objects.get(name="中国")

       Student2.objects.create(name='白月', grade=1, country=c1)

项目举例:

相关知识点:

见:1. 常见的类视图_A~taoker的博客-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Ataoker/article/details/130734106

智能推荐

5个超厉害的资源搜索网站,每一款都可以让你的资源满满!_最全资源搜索引擎-程序员宅基地

文章浏览阅读1.6w次,点赞8次,收藏41次。生活中我们无时不刻不都要在网站搜索资源,但就是缺少一个趁手的资源搜索网站,如果有一个比较好的资源搜索网站可以帮助我们节省一大半时间!今天小编在这里为大家分享5款超厉害的资源搜索网站,每一款都可以让你的资源丰富精彩!网盘传奇一款最有效的网盘资源搜索网站你还在为找网站里面的资源而烦恼找不到什么合适的工具而烦恼吗?这款网站传奇网站汇聚了4853w个资源,并且它每一天都会持续更新资源;..._最全资源搜索引擎

Book类的设计(Java)_6-1 book类的设计java-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏18次。阅读测试程序,设计一个Book类。函数接口定义:class Book{}该类有 四个私有属性 分别是 书籍名称、 价格、 作者、 出版年份,以及相应的set 与get方法;该类有一个含有四个参数的构造方法,这四个参数依次是 书籍名称、 价格、 作者、 出版年份 。裁判测试程序样例:import java.util.*;public class Main { public static void main(String[] args) { List <Book>_6-1 book类的设计java

基于微信小程序的校园导航小程序设计与实现_校园导航微信小程序系统的设计与实现-程序员宅基地

文章浏览阅读613次,点赞28次,收藏27次。相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了校园导航的标准化、制度化、程序化的管理,有效地防止了校园导航的随意管理,提高了信息的处理速度和精确度,能够及时、准确地查询和修正建筑速看等信息。课题主要采用微信小程序、SpringBoot架构技术,前端以小程序页面呈现给学生,结合后台java语言使页面更加完善,后台使用MySQL数据库进行数据存储。微信小程序主要包括学生信息、校园简介、建筑速看、系统信息等功能,从而实现智能化的管理方式,提高工作效率。

有状态和无状态登录

传统上用户登陆状态会以 Session 的形式保存在服务器上,而 Session ID 则保存在前端的 Cookie 中;而使用 JWT 以后,用户的认证信息将会以 Token 的形式保存在前端,服务器不需要保存任何的用户状态,这也就是为什么 JWT 被称为无状态登陆的原因,无状态登陆最大的优势就是完美支持分布式部署,可以使用一个 Token 发送给不同的服务器,而所有的服务器都会返回同样的结果。有状态和无状态最大的区别就是服务端会不会保存客户端的信息。

九大角度全方位对比Android、iOS开发_ios 开发角度-程序员宅基地

文章浏览阅读784次。发表于10小时前| 2674次阅读| 来源TechCrunch| 19 条评论| 作者Jon EvansiOSAndroid应用开发产品编程语言JavaObjective-C摘要:即便Android市场份额已经超过80%,对于开发者来说,使用哪一个平台做开发仍然很难选择。本文从开发环境、配置、UX设计、语言、API、网络、分享、碎片化、发布等九个方面把Android和iOS_ios 开发角度

搜索引擎的发展历史

搜索引擎的发展历史可以追溯到20世纪90年代初,随着互联网的快速发展和信息量的急剧增加,人们开始感受到了获取和管理信息的挑战。这些阶段展示了搜索引擎在技术和商业模式上的不断演进,以满足用户对信息获取的不断增长的需求。

随便推点

控制对象的特性_控制对象特性-程序员宅基地

文章浏览阅读990次。对象特性是指控制对象的输出参数和输入参数之间的相互作用规律。放大系数K描述控制对象特性的静态特性参数。它的意义是:输出量的变化量和输入量的变化量之比。时间常数T当输入量发生变化后,所引起输出量变化的快慢。(动态参数) ..._控制对象特性

FRP搭建内网穿透(亲测有效)_locyanfrp-程序员宅基地

文章浏览阅读5.7w次,点赞50次,收藏276次。FRP搭建内网穿透1.概述:frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。2.简单的图解:3.准备工作:1.一个域名(www.test.xyz)2.一台有公网IP的服务器(阿里云、腾讯云等都行)3.一台内网主机4.下载frp,选择适合的版本下载解压如下:我这里服务器端和客户端都放在了/usr/local/frp/目录下4.执行命令# 服务器端给执_locyanfrp

UVA 12534 - Binary Matrix 2 (网络流‘最小费用最大流’ZKW)_uva12534-程序员宅基地

文章浏览阅读687次。题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93745#problem/A题意:给出r*c的01矩阵,可以翻转格子使得0表成1,1变成0,求出最小的步数使得每一行中1的个数相等,每一列中1的个数相等。思路:网络流。容量可以保证每一行和每一列的1的个数相等,费用可以算出最小步数。行向列建边,如果该格子是_uva12534

免费SSL证书_csdn alphassl免费申请-程序员宅基地

文章浏览阅读504次。1、Let's Encrypt 90天,支持泛域名2、Buypass:https://www.buypass.com/ssl/resources/go-ssl-technical-specification6个月,单域名3、AlwaysOnSLL:https://alwaysonssl.com/ 1年,单域名 可参考蜗牛(wn789)4、TrustAsia5、Alpha..._csdn alphassl免费申请

测试算法的性能(以选择排序为例)_算法性能测试-程序员宅基地

文章浏览阅读1.6k次。测试算法的性能 很多时候我们需要对算法的性能进行测试,最简单的方式是看算法在特定的数据集上的执行时间,简单的测试算法性能的函数实现见testSort()。【思想】:用clock_t计算某排序算法所需的时间,(endTime - startTime)/ CLOCKS_PER_SEC来表示执行了多少秒。【关于宏CLOCKS_PER_SEC】:以下摘自百度百科,“CLOCKS_PE_算法性能测试

Lane Detection_lanedetectionlite-程序员宅基地

文章浏览阅读1.2k次。fromhttps://towardsdatascience.com/finding-lane-lines-simple-pipeline-for-lane-detection-d02b62e7572bIdentifying lanes of the road is very common task that human driver performs. This is important ..._lanedetectionlite

推荐文章

热门文章

相关标签