ORM 关系对象映射 基础知识点_weixin_30578677的博客-程序员秘密

技术标签: python  数据库  

优点:

  1.ORM使我们通用的数据库变得更加的简单便捷。

  2.可避免新手程序员写sql语句带来的性能问题。

 

1. 创建单表
2. 创建关键表
1). 一对一
2). 一对多
3). 多对多

 

创建表的语句:

python manage.py makemigrations

python manage.py migrate

 

插入:

Author.object.create(**{
    'name':'wjw'})

修改:

# 方法一

author = models.Author.objects.get(id=5)
    author.name = 'haha'
    author.save()

# 方法二
    models.Author.objects.filter(id=5).update(name='haha')

查询:

.filter(**kwargs)  # 集合
.all()  # 集合
.get(**kwargs)   # 行对象

排序:

au = models.Author.objects.order_by('-id')
.reverse() 对查询结果反向排序

.distinct() 从返回结果中去重

.count()  数量

.first()   取第一条

.last()   取最后一条

.exists()  如果QuerySet中包含数据返回true,否则返回false

 

 

一对多:

创建数据表

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()


class Book(models.Model):
    author = models.ForeignKey('Author', on_delete=models.CASCADE)
    namebook = models.CharField(max_length=32)
    nametype = models.CharField(max_length=32)

正向查询

  # 正向查询
    obj = models.Book.objects.filter(namebook='python')[0]
    print(obj.author.name)
    # 连级查询
    obj = models.Book.objects.values('namebook', 'author__name')[0]
    print(obj['namebook'] + "++++" + obj['author__name'])

反向查询

  # 反向查询
    obj = models.Author.objects.filter(name='lixiangshuai')[0]
    list = obj.book_set.all().values('namebook')
    print(list)
    for item in list:
        print(item['namebook'])

 

多对多:

创建多对多数据表

class Teacher(models.Model):
    name = models.CharField(max_length=32)
    sex = models.CharField(max_length=32)


class Student(models.Model):
    name = models.CharField(max_length=32)
    sex = models.CharField(max_length=32)
    teacher = models.ManyToManyField('Teacher')

正向查询

s = models.Student.objects.filter(name='wangjiawei')[0]
t = s.teacher.all()
for i in t:
   print(i.name)

反向查询

t = models.Teacher.objects.get(name='zhangjiong')
s = t.student_set.all()
# s = t.student_set.all().values('name')
for i in s: 
  print(i.name)

 

基于 __ (双下划綫)的条件查找:

只适用于单表

id__lt = 10, id__gt = 1      #   id>1 并且 id<10
id__in = [11, 22, 33]        # id = 11,22,33,的数据
.exclude(id__in=[11, 22, 33])  #  not in
id__range = [1,2]          #  范围 bettween··· and ···
name__contains = 'ven'  
name__icontains = 'ven'     #  icontains 大小写不敏感
__startwith = 'p'    # 开头是 p

 

聚合查询

.aggregate(*args, **kwargs)  # 平均价格
.aggregate(avarage_price = Avg('price'))
>>> {
    'avarage_price':34.35}
Avg 平均值
Min  最小值
Max 最大值
Sum 求和

 

分组查询

annotate(*args, **kwargs)

models.Author.objects.values('author__name').annotate(sum('price'))

 

 

 

完成~! 收工!!~!~!

 

转载于:https://www.cnblogs.com/wjw1014/p/8671080.html

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

智能推荐

oracle导入后丢失触发器,触发器对IMP/IMPDP导入结果的影响(二)_振宁不是振宇的博客-程序员秘密

上一篇文章讨论了触发器的存在对IMP导入结果的影响。可以看到,对于存在触发器的表,在IMP导入后,将会对结果产生影响。下面看看触发器对IMPDP导入结果的影响。还是利用前面创建的表。SQL&gt; SELECT TRIGGER_NAME,TABLE_NAME,STATUS FROM USER_TRIGGERS;TRIGGER_NAME TABLE_NAME ST...

Multi-task Learning(Review)多任务学习概述_喜欢打酱油的老鸟的博客-程序员秘密

https://www.toutiao.com/a6707402838705701383/背景:只专注于单个模型可能会忽略一些相关任务中可能提升目标任务的潜在信息,通过进行一定程度的共享不同任务之间的参数,可能会使原任务泛化更好。广义的讲,只要loss有多个就算MTL,一些别名(joint learning,learning to learn,learning with auxil...

浅谈Java反序列化漏洞原理(案例未完善后续补充)_b627074592的博客-程序员秘密

序列化与反序列化序列化用途:方便于对象在网络中的传输和存储java的反序列化序列化就是将对象转换为流,利于储存和传输的格式反序列化与序列化相反,将流转换为对象例如:json序列化、XML序列化、二进制序列化、SOAP序列化序列化:java.io.ObjectOutputStream 类中的 writeObject()该方法把对象序列化,将字节序列写到一个目标输出流...

【NFS】client mount协商处理流程_nfs struct rpc_msg_小-码虫的博客-程序员秘密

linux内核版本:3.10.0挂载nfs版本:-o vers=4.0挂载命令mount -t nfs -o vers=4.0 127.0.0.1:/ /mnt/nfstest关键的几个函数:nfs_fs_mount: mount入口nfs_validate_mount_data: 解析参数入口(nfs_parse_mount_options、nfs_parse_devname)nf...

python异步爬虫_爬虫里面的parse里面每次开一个线程,导致同步_Ricardo.M.Jiang的博客-程序员秘密

本文主要包括以下内容           线程池实现并发爬虫回调方法实现异步爬虫协程技术的介绍一个基于协程的异步编程模型协程实现异步爬虫线程池、回调、协程我们希望通过并发执行来加快爬虫抓取页面的速度。一般的实现方式有三种:线程池方式:开一个线程池,每当爬虫发现一个新链接,就将链接放入任务队列中,线程池中的线程从任务队列获取一个链接,之后建立socket,完成抓取页面、解析、将新连接放入

【收藏】机器学习入门的常见问题集_hzbooks的博客-程序员秘密

导读:机器学习如何入门?那些还在不断叩击着机器学习之门,迟迟未入门的同学应该怎么做?今天小编带大家听听木羊同学怎么说...作者:木羊同学来源:华章计算机(hzbook_jsj)大家好,我...

随便推点

【折腾ubuntu】Ubuntu12.04安装windows版本的福昕阅读器__suzhou的博客-程序员秘密

福昕阅读器时一款特别好用的pdf阅读器,之所以一直使用虚拟机跑Linux,一部分原因就是因为舍不得windows下面的几个好用的软件,今天试着在Linux下面装一个福昕阅读器,这可能是全面转向Linux,抛弃windows的一个开始。。在ubuntu下安装exe文件,需要wine这个工具。1 安装wine工具1 sudo add-apt-repository ppa:ubunt

C/C++混淆点-strcat和strcpy区别_strcat和strcpy的区别_chde2Wang的博客-程序员秘密

一、原因分析假设: char * str=NULL; str=new char[11];你想为字符串str开辟一个存储十个字符的内存空间,然后你现在有两个字符串:char * c1="abc"和char * c2="123";你想将这两个字符串都拼接在str字符串中,你想用strcat这个函数。但是你直接用strcat编译器会报错!!!不能这样做,应该在拼接之前使用memset(字符串...

重载(overload)与重写(override)的区别 - JAVA课堂笔记整理_weixin_30293135的博客-程序员秘密

当实现的功能一致,但参与的未知内容不同时,用重载1、重载:方法名相同,参数不同。重写:方法名相同,参数的类型及返回值类型全部相同2、重载:对权限并没有严格的要求。重写:被重写的方法不能比重写的方法拥有更严格的权限。3、重载:发生在一个类之中。重写:发生在继承类中。4、不管什么时候,子类实例化的时候永远要先去调用父类中的构造方法,默认是调用无参的构造方法。转载于:https://www.cnblo...

计蒜客 气球消消乐_星辰浩宇的博客-程序员秘密

问题描述蒜头君有 n 只气球,蒜头君把气球排成一排。初始时,气球都是白色,现在蒜头君想用 m 种颜色给气球涂色,如果相邻的气球的颜色相同,这 2 个气球会发生消消乐,蒜头君希望你求出会发生消消乐的涂色方法有多少种。最后答案对 10^9+7取模。输入格式输入两个整数n(1&lt;=n&lt;=10^12),m(1&lt;=m&lt;=10^8)输出格式输出一行表示答案。样例输...

推荐文章

热门文章

相关标签