ORM查询相关的操作

必知必会13条

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django

django.setup()         #以上为脚本,可以在manage.py中获得

from app01 import models

# all   获取所有的数据   QuerySet   对象列表
# ret = models.Person.objects.all()

# get   获取某一条数据   对象    获取不到或者多个就报错
# ret = models.Person.objects.get(name=‘alex‘)

# filter   获取满足条件的所有对象   QuerySet   对象列表
# ret = models.Person.objects.filter(name=‘alex‘)

# exclude  获取不满足条件的所有对象  QuerySet   对象列表
ret = models.Person.objects.exclude(name=‘alex‘)

# values    获取数据字段名称和值    QuerySet   {}
#  不指定字段  查询所有字段的值
#  指定字段    查询指定字段的值
ret = models.Person.objects.filter(name=‘alex‘).values(‘pid‘, ‘name‘)   # 最后是以字典的形式显示

# values_list    获取数据字段的值    QuerySet   (值,值)       #最后是以元祖的形式显示
#  不指定字段  查询所有字段的值
#  指定字段    查询指定字段的值
# ret = models.Person.objects.filter(name=‘alex‘).values_list(‘pid‘, ‘name‘)

#  order_by  排序   多个字段排序   - 降序排序
# ret = models.Person.objects.order_by(‘age‘,‘-pid‘ )
# print(ret)

# reverse 在已经排好序的基础在反转
# ret = models.Person.objects.all()
# print(ret)
# ret = ret.reverse()
# print(ret)

# distinct()  去重
# ret = models.Person.objects.values_list(‘name‘).distinct()
# print(ret)

# count 计数
ret = models.Person.objects.filter(name=‘alex‘).count()

# first last    取对象列表中的第一个 最后一个
ret = models.Person.objects.filter(pid=1000).first()
# ret = models.Person.objects.all().last()

# exists()  查询结果是否存在
ret = models.Person.objects.filter(pid=100).exists()
print(ret)

"""

单表的双下划线方法

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")

import django

django.setup()

from app01 import models

ret = models.Person.objects.filter(pk__gt=100)    #查询的是ID大于100的人

ret = models.Person.objects.filter(pk__lt=103)    查询的是ID小于103的人

ret = models.Person.objects.filter(pk__gte=100)   查询的是ID大于等于100的人

ret = models.Person.objects.filter(pk__lte=103)   查询的是ID小于等于103的人

ret = models.Person.objects.filter(pk__in=[100,103])   查询的是ID是【100,103】的人

ret = models.Person.objects.filter(pk__range=[100,103])  查询的是ID在100-103范围内人

ret = models.Person.objects.filter(name__contains=‘L‘)  查询的是name字段中包含L的人

ret = models.Person.objects.filter(name__icontains=‘L‘)  查询的是name字段中包含大小写L的人

ret = models.Person.objects.filter(name__startswith=‘x‘)   查询的是name字段中以x开头的人

ret = models.Person.objects.filter(name__istartswith=‘X‘)  查询的是name字段中以大小写x开头的人

ret = models.Person.objects.filter(name__endswith=‘x‘)    查询的是以什么结尾的
ret = models.Person.objects.filter(name__iendswith=‘X‘)   不区分大小写

ret = models.Person.objects.filter(birth__year=‘2019‘) 可以查询出生年份是2019年的人

ret = models.Person.objects.filter(age__isnull=False) print(ret)  可以判断某个字段是不是空

外键操作

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django

django.setup()   #首先导入脚本

from app01 import models

book_obj = models.Book.objects.get(pk=3)
print(book_obj.publisher)      # 关联的对象
print(book_obj.publisher_id)   # 关联的对象id

不指定related_name  关联表的表名小写_set
ret = pub_obj.book_set.all()

指定related_name=‘books‘
ret = pub_obj.books.all()

基于字段的查询
ret = models.Book.objects.filter(publisher__name=‘**出版社‘)  #查出出版社名称是**出版社的书

不指定related_name
ret = models.Publisher.objects.filter(book__title=‘**的故事‘)

指定related_name = ‘books‘
ret = models.Publisher.objects.filter(books__title=‘**的故事‘)

指定related_query_name=‘book‘  再改完名字的基础上,再一次改名字
ret = models.Publisher.objects.filter(book__title=‘**的故事‘)

pub_obj.books.remove(models.Book.objects.get(pk=3)) #表示删除ID为3的书与出版社的关系

pub_obj.books.clear()  #清空所有图书与数的关系

pub_obj.books.create(title=‘qqqq‘)   创建出版社对象与title=“qqqq”的书的关系

多对多操作

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django

django.setup()   # 导入测试脚本

from app01 import models

author_obj = models.Author.objects.get(pk=2)

set()  设置多对多关系    既能设置[id  ]也能设置 [ 对象 ]
author_obj.books.set([2,4])    设置作者ID为2的与书的ID为2和4的关系
author_obj.books.set(models.Book.objects.filter(id__in=[1,3]))   设置作者ID为2与书的ID为1和3的关系
反向设置
book_obj.author_set.set([3])  

add() 添加多对多关系
author_obj.books.add(1,2)
author_obj.books.add(models.Book.objects.get(pk=4))

remove() 删除多对多关系
author_obj.books.remove(1,2)
author_obj.books.remove(models.Book.objects.get(pk=4))

clear() 清空所有多对多关系
author_obj.books.clear()

create   创建多对多关系
author_obj.books.create(title=‘****‘,publisher_id=1)
book_obj.author_set.create(name=‘xxx‘)

聚合和分组

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django
django.setup()   导入脚本进行测试

from app01 import models
from django.db.models import Max, Min, Sum, Count, Avg  导入聚合函数

aggregate()是QuerySet 的一个终止子句   表示聚合的意思
ret = models.Book.objects.all().aggregate(max=Max(‘price‘), min=Min(‘price‘))   #所有图书中最高价格与最低价格的书

ret = models.Book.objects.filter(publisher__name=‘**出版社‘).aggregate(max=Max(‘price‘), min=Min(‘price‘))  筛选出**出版社出版的书的最高与最低价格的书

统计每一本书的作者个数
ret = models.Book.objects.annotate(Count(‘author‘))

统计出每个出版社买的最便宜的书的价格
ret = models.Publisher.objects.annotate(Min(‘book__price‘)).values()
ret = models.Book.objects.values(‘publisher__name‘).annotate(Min(‘price‘))
ret = models.Book.objects.values(‘publisher‘).annotate(min=Min(‘price‘)).values(‘publisher__name‘, ‘min‘, )
 统计不止一个作者的图书
ret = models.Book.objects.annotate(count=Count(‘author‘)).filter(count__gt=1)
 根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret = models.Book.objects.annotate(count=Count(‘author‘)).order_by(‘-count‘)
 查询各个作者出的书的总价格
ret = models.Author.objects.annotate(Sum(‘books__price‘)).values()

F和Q

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django

django.setup()  #导入脚本进行测试

from app01 import models
from django.db.models import F, Q  

F比较两个字段之间的关系
ret =models.Book.objects.filter(sale__gt=F(‘kucun‘)).values()   # 查询销量大于库存的图书
for i in ret:
     print(i)
#更新销量是原来的两倍
models.Book.objects.all().update(sale=F(‘sale‘) * 2)

#Q可以同时查询多个条件出来
 ~Q表示非的意思
| 表示或的意思
&表示and的意思
ret = models.Book.objects.filter(~Q(Q(id__lt=2) | Q(id__gt=4)) & Q(id__gt=3))

事务

import os

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_practice.settings")
import django

django.setup()

from app01 import models
from django.db import transaction   导入事务

try:
    with transaction.atomic():   原子性操作,一个成功都成功,一个不成功都不成功
     models.User.objexts.filter(id__gt=3).select_for_update()
        models.Publisher.objects.create(name=‘**出版社‘)
        # models.Publisher.objects.create(name=‘**出版社‘)
        # models.Publisher.objects.create(name=‘**出版社‘)
        # models.Publisher.objects.create(name=‘**出版社‘)
except Exception as e:
    print(e)

原文:https://www.cnblogs.com/xinjie123/p/10988329.html

原文地址:https://www.cnblogs.com/gcgc/p/12133018.html

时间: 2024-08-30 17:46:42

ORM查询相关的操作的相关文章

ORM查询相关补充

自己没有记住的一点小知识(ORM查询相关) 一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.

Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)

models中的常用字段 AutoField(primary_key=True) 主键   (int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列.) CharField(max_length=32)     varchar(32) IntegerField()       int BigIntergerField()           bigint DecimalField()    decimal EmailField(

Django 第十课 4.【ORM查询操作】

#查询 1:exact:在底层会被翻译成 '=' article = Article.objects.filter(title__exact='hello') 2:iexact:在底层被翻译成 'LIKE' article = Article.objects.filter(title__iexact='hello') * LIKE 和 = :大部分情况下都是等价的,只有少数情况下是不等价的. * exact和iexact:他们的区别其实就是LIKE和=的区别,因为exact会被翻译成=,而iex

django模型层 、 ORM查询

模型层 ORM查询 单表查询 前期准备工作需求: 如何只单独测试django中的某一个py文件 如何书写测试脚本 如何使用: 在任意一个py文件中书写以下代码 应用下的tests 或者自己新建一个 import os if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings") import django django.se

uva 12299 线段树 点相关的操作模板

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=502&page=show_problem&problem=3720 唯一值得一说的就是shift,变成更新点就行 这道题主要是测试下我做的算法模板 先贴模板 /**************************************************************** 2014.4 By Pilgr

Django开发:(3.1)ORM:单表操作

MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 ORM是"对象-关系-映射"的简称. Mysql中的表对应python中的类,表的字段对应类的属性,表的记录对应类的实例化的对象 单表操作 创建表 1. 创建模型 创建名为app01的app,在app01下的models.py中创建模型: from dj

django知识之ORM查询

1. ORM字段 1. AutoField(primary_key=True)      -------->自增且主键 2. CharField(max_length=16)         --------->varchar类型(char类型可以自定义 类改写db_type) 3. IntegerField(null=True) --> 最大10位    -------->int类型(最大10位所以手机号码一般用char或者varchar类型) 4. DateField(auto

ORM查询

单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11.22.33的数据models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in models.Tb1.objects.filter(name__contains="ven")

Django框架——模型(models)层之ORM查询(二)

1.聚合查询 聚合函数 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 2.分组查询 关键字:annotate 统计每一本书的作者个数 models.Book.objects.annotate(author_num = Count('author')).values('title') 统计每一个出版社卖的最便宜的书的价格 models.Book.objects.annotate(price_min=Min('boo