Django ORM相关
1. ORM 外键关联查询和多对多关系正反向查询
Class Classes():
name = CF
class Student():
name = CF
class = FK(to="Classes")
class Teacher():
name = CF
classes = M2M(to="Classes",related_name="teacher")
简单表结构
# Fk 正向查找
obj = models.Student.objects.first()
print(obj.class_id)
# FK 反向查找
obj = models.Classes.objects.first()
print(obj.student_set.all())
# M2M 正向查找
obj = models.Teacher.objects.get(pk=1)
print(obj.classes.all())
# M2M 反向查找
obj = models.Classe.objects.get(pk=1)
print(obj.teacher.all())
简单实例
2. F查询和Q查询
F查询可以对当前查询出来的对象取值,就是像自赋值 a = a+20,更新字段方便
from django.db.models import F
from app01.models import Book
Book.objects.update(price=F("price")+20) # 对于book表中每本书的价格都在原价格的基础上增加20元
F查询
Q查询可以对当前查询的表进行多次筛选,可以组合使用&, | ,比如查询2005年初生且姓是W开头的, 2005年出生或姓名是W
from django.db.models import Q obj = student.objects.filter(Q(Bd_year=2005) & Q(name_startswith="W")) obj = student.objects.filter(Q(Bd_year=2005) | Q(name_startswith="W"))
Q查询
3. ORM事务操作
from app01 import models
try:
from django.db import transaction
with transaction.atomic():
(进行事务操作)
except Exception as e:
pass
事务简单实例
4. 连表查询提高性能
#select_related, 连表操作, 相当于主动做join
#prefetch_related, 多次单表操作, 先查询想要的数据, 然后构造条件
如: id[1,2,3],再次查询其他表根据id做条件
连表查询
5. 通过ORM写原生SQL
# - extra 结果集修改器,是吗一种提供额外查询参数的机制
books= Book.objects.filter(publish='清华出版社').extra(where=['price>50'])
# - raw 执行原始sql并返回模型实例
books = Book.objects.raw('select * from book where publish="清华出版社"')
- 原生SQL
from django.db import connection
cursor=connection.cursor() # 建立游标
cursor.execute("insert into book(name) values('小王子')") #插入操作
cursor.execute('update book set name='梦里花落知多少' where name='撒哈拉的故事'') #更新操作
cursor.execute('delete from book where name='小王子'') #删除操作
cursor.execute('select * from book') #查询操作
raw = cursor.fetchone() #读取一条
raw_list = cursor.fetchall() #读取所有,返回list
cursor.close() #关闭游标
原生SQL
6. 自定义管理器
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.contrib.auth.models import User
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager, self).get_queryset().filter(status='published')
class Post(models.Model):
STATUS_CHOICES = (('draft', 'Draft'), ('published', 'Published'))
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique_for_date='publish')
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
objects = models.Manager() # 默认的管理器
published = PublishedManager() # 自定义管理器
def get_absolute_url(self):
return reverse('blog:post_detail', args=[self.publish.year, self.publish.month, self.publish.day, self.slug])
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
自定义管理器
Django ORM相关的更多相关文章
- Django学习笔记之Django ORM相关操作
一般操作 详细请参考官方文档 必知必会13条 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> ...
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- django—ORM相关
常用的QuerySet方法 1.all() 查询表中所有数据,返回一个QuerySet对象列表 2.filter() 查询满足条件的数据,返回一个QuerySet对象列表 3.get() 查询指定的数 ...
- Django框架详细介绍---ORM相关操作
Django ORM相关操作 官方文档: https://docs.djangoproject.com/en/2.0/ref/models/querysets/ 1.必须掌握的十三个方法 <1& ...
- Django ORM那些相关操作zi
Django ORM那些相关操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...
- Django ORM 那些相关操作
Django ORM 那些相关操作 一般操作 必知必会13条 <> all(): #查询所有的结果 <> filter(**kwargs) # 它包含了与所给筛选条件相匹配的对 ...
- Django ORM那些相关操作
一般操作 https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 官网文档 常用的操作 <1> all() ...
- django orm 及常用参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
- Django ORM中常用字段和参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
随机推荐
- 使用git push命令如何忽略不想提交的文件夹或者文件
如下场景是在window下的操作. 在使用node的时候有个node_modules文件夹很大,一般情况下不想提交,忽略的办法如: 方法一(来自评论区):直接在仓库根目录:执行命令echo 'node ...
- 使用iconv进行编码gb2312转utf8 转码失败的坑
iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和 ...
- JavaScript复杂判断的更优雅写法
摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...
- webpack2利用插件clean-webpack-plugin来清除dist文件夹中重复的文件
配置文件如下 /** * Created by oufeng on 2017/5/6. */ const webpack = require('webpack'); const path = requ ...
- 2018-02-18 Antlr4实现简单语言之条件语句
本系列之前的文章: Antlr4的分析错误处理 Antlr4实现数学四则运算 Antlr4添加中文变量赋求值,括号,各种问题 Antlr4: 修改语法规则更接近普通BNF格式 Antlr4实现简单语言 ...
- python之MRO和C3算法
python2类和python3类的区别pyhon2中才分新式类与经典类,python3中统一都是新式类Python 2.x中默认都是经典类,只有显式继承了object才是新式类python 3.x中 ...
- WebGL学习笔记(一)
作者:朱金灿 来源:http://blog.csdn.net/clever101 (一)WebGL是什么? WebGL是一门在网页上显示三维图形的技术,你可以把它理解为把OpenGL从C/S端搬到了B ...
- PostGIS空间查询
select * from footprints t where ST_intersects(t.geom,ST_GeomFromGeoJSON('{"type":"Po ...
- Flume组件汇总2
Component Interface Type Alias Implementation Class org.apache.flume.Channel memory org.apache.flume ...
- 关于web优化(一)
我们所说的web,无非就是html,css(web font, image),JavaScript. HTML优化建议: 1. 尽量不要用table进行布局. 2. 尽量用最新的带有语义的h5标签,这 ...