这里写目录标题

  • .all()方法
  • .values()方法
  • .values_list()方法
  • .order_by()方法
  • .filter()
  • .exclude()不符合条件
  • .get()
  • 多个条件一起为and,or,not关系,例:
  • 表自加
  • 俩列比较
  • 表聚合
  • 分组聚合
  • 原生数据库操作(使用sql语句操作):
  • 非等值查询:
  • __exact # 等值查询 主要查询null
  • __contains # 包含指定值(__icontains)
  • __startswith # 以***为开始
  • __endswith # 以***为结束
  • __gt # 大于指定值
  • __gte # 大于等于
  • __lt # 小于
  • __lte # 小于等于
  • __in # 查询数据是否在指定范围内
  • __range # 查询数据是否在指定区间内
  • 数据库增加数据
  • 数据库修改数据
  • 数据库删除数据
  • 合并俩QuerySet:
  • 一对多,多对多外键查询后数据库数据重复,去重:
  • .annotate()可重命名values查询查出来的字典的key
  • 原生sql查询
  • row方法:(掺杂着原生sql和orm来执行的操作)
  • select提供简单数据
  • connection(类似pymysql)


.all()方法

用法:MyModel.objects.all()
作用:查询MyModel实例中的所有数据
相当于  select * from table;
返回:QuerySet

from bookstore.models import Book
books=Book.objects.all()
for book in books:
	print(book.title,book.pub)

.values()方法

用法:MyModel.objects.values()
作用:查询MyModel实例中的部分列
相当于  select a,b from table;
返回:QuerySet 内字典

from bookstore.models import Book
books=Book.objects.values()
for book in books:
	print(book['title'],book['pub'])

.values_list()方法

用法:MyModel.objects.values_list()
作用:查询MyModel实例中的部分列
相当于  select a,b from table;
返回:QuerySet 内元组

from bookstore.models import Book
books=Book.objects.values_list()
for book in books:
	print(book['title'],book['pub'])

.order_by()方法

用法:MyModel.objects.order_by("列","列")
作用:查询MyModel实例中的所有数据,并按照所给的列进行排序
说明:默认升序,倒序 order_by("-列","-列")
返回:QuerySet

from bookstore.models import Book
books=Book.objects.order_by('pub')
for book in books:
	print(book.title,book.pub)
可以拼接使用,例如MyModel.objects.values().order_by("列","列")
print(books.query)可以得到sql语句

.filter()

用法:MyModel.objects.filter(条件1,条件2)
作用:查询MyModel实例中的符合条件的数据值
说明:条件1:a=b,键值对形式
	多个条件一起为and关系
返回:QuerySet

from bookstore.models import Book
books=Book.objects.filter(pub="清华大学出版社")
for book in books:
		print(book.title,book.pub)

.exclude()不符合条件

用法:MyModel.objects.exclude(条件1,条件2)
作用:查询MyModel实例中的不符合条件的数据值
说明:条件1:a=b,键值对形式
	多个条件一起为and关系
返回:QuerySet

from bookstore.models import Book
books=Book.objects.exclude(pub="清华大学出版社")
for book in books:
		print(book.title,book.pub)

.get()

用法:MyModel.objects.get(条件1,条件2)
作用:查询MyModel实例中的符合条件的 一条 数据
说明:条件1:a=b,键值对形式
	多个条件一起为and关系
	数据查询多余一条报错  MultipleObjectsReturned
	数据查询少余一条报错  DoesNotExist
返回:object

from bookstore.models import Book
book=Book.objects.get(pub="清华大学出版社")
print(book.title,book.pub)

多个条件一起为and,or,not关系,例:

from django.db.models import Q,F
Q(条件1) |  Q(条件2)
Q(条件1) &  Q(条件2)
Q(条件1) &  ~Q(条件2)

表自加

Book.objects.all().update(market_price=F('market_price')+10)

俩列比较

book = Book.objects.filter(market_price__gt = F('price'))

表聚合

导入 from django.db.models import *
函数 Sum , Avg , Count , Max , Min
语法 MyModel.objects.aggregate(结果变量名=聚合函数("列"))
返回结果:{结果变量名:值}

#结果变量名自定义

分组聚合

QuerySet.annotate(结果变量名=聚合函数("列"))
返回结果:QuerySet

原生数据库操作(使用sql语句操作):

⑴不建议,易被sql注入

语法 MyModel.objects.raw(sql语句)
返回值  RawQuerySet(只支持基础操作,比如循环)

防范

MyModel.objects.raw(sql语句,拼接参数)
MyModel.objects.raw(select * from table where ID=%s,[str])

from django.db import connection
whith connection.cursor() as cur:
	cur.execute(sql语句,拼接参数)

非等值查询:

查询谓词(适用于(filter,exclude,get))

__exact # 等值查询 主要查询null

用法:MyModel.objects.filter(id__exact=1)
相当于  select * from table where id =1;

__contains # 包含指定值(__icontains)

用法:MyModel.objects.filter(name__contains="w")
相当于  select * from table where name like "%w%";

MyModel.objects.filter(name__icontains=“w”)
忽略大小写

__startswith # 以***为开始

相当于  select * from table where name like "w%";

__endswith # 以***为结束

相当于  select * from table where name like "%w";

__gt # 大于指定值

用法:MyModel.objects.filter(id__gt=1)
相当于  select * from table where id > 1;

__gte # 大于等于

__lt # 小于

__lte # 小于等于

__in # 查询数据是否在指定范围内

用法:MyModel.objects.filter(id__in=[1,4,8])
相当于  select * from table where id in (1,4,8);

__range # 查询数据是否在指定区间内

用法:MyModel.objects.filter(id__range = (2,9))
相当于  select * from table where id between 2 and 9;

数据库增加数据

from bookstore.models import Book
book1 = Book(name='runoob')
book1.save()

# 另外一种方式
# book1 = Book.objects.create(name='runoob')

# 批量增加数据
# create_list = []
# book1 = Book(name='runoob1')
# create_list.append(book1)
# book2 = Book(name='runoob2')
# create_list.append(book2)
# Book.objects.bulk_create(create_list)

# 修改或创建
# Book.objects.update_or_create(name='runoob1',defaults={"name":"runoob1"})

数据库修改数据

from bookstore.models import Book
book1 = Book.objects.get(id=1)
book1.name = 'Google'
book1.save()

# 另外一种方式
# Book.objects.filter(id=1).update(name='Google')

# 修改所有的列
# Book.objects.all().update(name='Google')

数据库删除数据

(数据库一般不删除数据而是把is_delete列设为True)

test1 = Test.objects.get(id=1)
test1.delete()
# 另外一种方式
# Book.objects.filter(id=1).delete()

# 删除所有数据
# Book.objects.all().delete()

合并俩QuerySet:

(注合并后count()计数出错,可
len([i.id for i in alarms_query_set])进行计数)

queryset = queryset1.union(queryset2)

数据库版本低可能连接多个Queryset会报错

queryset = list(queryset1) + list(queryset2)

会返回一个list列表可正常进行序列化操作

一对多,多对多外键查询后数据库数据重复,去重:

A.objects.values_list("id",'name').filter(data__is_valid=1).distinct()

.annotate()可重命名values查询查出来的字典的key

A.objects.filter(is_valid=1).annotate(id=F("B__id")).values("id")

原生sql查询

row方法:(掺杂着原生sql和orm来执行的操作)

res = cookbook.objects.raw('select id as nid from epos_cookbook where id>%s', params=[1, ])
print(res.columns) # ['nid']
print(type(res)) # <class 'django.db.models.query.rawqueryset'>
 
# 在select里面查询到的数据orm里面的要一一对应
res = cookbook.objects.raw("select * from epos_cookbook")
print(res)
for i in res:
  print(i.create_date)
  print(i)
  
res = cookbook.objects.raw('select * from epos_cookbook where id>%s', params=[1, ])
# 后面可以加参数进来
print(res)
for i in res:
  # print(i.create_date)
  print(i)

select提供简单数据

# select age, (age > 18) as is_adult from myapp_person;
person.objects.all().extra(select={'is_adult': "age > 18"}) # 加在select后面
 
## where提供查询条件
# select * from myapp_person where first||last ilike 'jeffrey%';
person.objects.all().extra(where=["first||last ilike 'jeffrey%'"]) # 加一个where条件
 
## table连接其它表
# select * from myapp_book, myapp_person where last = author_last
book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面
 
## params添参数
# !! 错误的方式 !!
first_name = 'joe' # 如果first_name中有sql特定字符就会出现漏洞
person.objects.all().extra(where=["first = '%s'" % first_name])
# 正确方式
person.objects.all().extra(where=["first = '%s'"], params=[first_name])

connection(类似pymysql)

from django.db import connection
 
 cursor=connection.cursor()
 # 如果需要配置数据库
 # cursor=connection['default'].cursor()
 
 cursor.execute('select * from test')
 
 ret=cursor.fetchall()
 
 print(ret)