ORM操作
https://www.cnblogs.com/maple-shaw/articles/9403501.html
一、一般操作
1. 必知必会13条
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <1> all(): 查询所有结果 2 3 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 4 5 <3> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 6 7 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 8 9 <5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列 10 11 <6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 12 13 <7> order_by(*field): 对查询结果排序 14 15 <8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。 16 17 <9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。) 18 19 <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 20 21 <11> first(): 返回第一条记录 22 23 <12> last(): 返回最后一条记录 24 25 <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False
2. 单表查询之神奇的双下划线
1) id__gt id__gte id__lt id__lte id__in id_range=[1,5]
2) name__contains name__icontains name__startswith name__istartswith name__endswith name__iendswith
3) date字段 birthday__year birthday__month birthday__day
4) __exact __iexact #精确等于like'aaa'
5) __regex __iregex
二、ForeignKey操作
1.正向查找
1) 对象查找跨表
book_obj.publisher
book_obj.publisher.name
2) 字段查
models.Book.objects.values_list("publisher__name")
2.反向操作
对象查找: obj.表名_set (设置了related_name 按此查询) 拿到管理的对象
字段查找:表名__字段
三、ManyToManyField操作
通过表与表之间的管理对象进行相关的骚操作,针对一对多、多对多的操作:
create()
add()
set()
remove()
clear()
ForeignKey字段没设置null=True时,没有clear()和remove()方法
ForeignKey字段设置null=True时,有clear()和remove()方法
对于所有类型的关联字段,add()、create()、remove()和clear(),set()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调save()方法
四、聚合查询和分组查询
1.聚合查询
models.Book.objects.aggregate(average_price=Avg('price'))
2.分组查询(基本思路先查出分组对象,然后调用annotate进行分组计算)
1)
from django.db.models import Avg Employee.objects.values("dept").annotate(avg=Avg("salary").values("dept", "avg")
2)
from django.db.models import Avg models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")
五、F查询和Q查询
1 F查询
F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
2 Q查询
你需要执行更复杂的查询(例如OR语句)
Q(id=1) |Q(id>3) & ~
注意点:查询函数可以混合使用Q 对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,关键字参数必须位于所有关键字参数的前面。
3 字符串拼接
六、事务 transaction
from django.db import transaction
with transaction.atomic():
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() import datetime from app01 import models try: from django.db import transaction with transaction.atomic(): new_publisher = models.Publisher.objects.create(name="火星出版社") models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10) # 指定一个不存在的出版社id except Exception as e: print(str(e))
七、Django终端打印SQL语句
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
八、在Python脚本中调用Django环境
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings") import django django.setup() from app01 import models books = models.Book.objects.all() print(books)
九、其他
Django ORM执行原生SQL
QuerySet方法大全