F与Q 查询

class Product(models.Model):
name = models.CharField(max_length=32) #都是类实例化出来的对象
price = models.DecimalField(max_digits=8,decimal_places=2)
sell_out = models.IntegerField()
stock = models.IntegerField() def __str__(self):
return '商品对象的名字:%s'%self.name

models

import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "第十三周day59.settings")
import django
django.setup()
from app01 import models #查询卖出数大于50 的商品
res = models.Product.objects.filter(sell_out__gt=20)
print(res) #<QuerySet [<Product: 商品对象的名字:上衣>, <Product: 商品对象的名字:裤子>]> #F查询
#查询卖出数大于库存数的商品
from django.db.models import F,Q res = models.Product.objects.filter(sell_out__gt=F('stock'))
print(res) #<QuerySet [<Product: 商品对象的名字:上衣>, <Product: 商品对象的名字:鞋子>]> #将所有的商品的价格提高100块
models.Product.objects.update(price=F('price')+100)
# 将所有的商品名字后面都加一个爆款
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'),Value('爆款'))) #Q查询
res = models.Product.objects.filter(price=188.88,name='连衣裙')
print(res) #and 连接 from django.db.models import F,Q
res = models.Product.objects.filter(Q(price=130),Q(name='上衣爆款'))
print(res) #and连接 Q对象查询默认也是and res = models.Product.objects.filter(Q(price=130)|Q(name='裤子爆款'))
print(res) # or <QuerySet [<Product: 商品对象的名字:裤子爆款>, <Product: 商品对象的名字:外套爆款>]> res = models.Product.objects.filter(Q(price=109)|~Q(name='裤子爆款'))
print(res) # not <QuerySet [<Product: 商品对象的名字:上衣爆款>, <Product: 商品对象的名字:鞋子爆款>, <Product: 商品对象的名字:外套爆款>]> # 混合使用 需要注意的是Q对象必须放在普通的过滤条件前面
res = models.Product.objects.filter(~Q(name='裤子爆款'),price=220)
print(res) #not <QuerySet [<Product: 商品对象的名字:上衣爆款>]> # Q对象补充
from django.db.models import F,Q
q = Q()
q.connector = 'or' #通过这个参数可以将Q对象默认的默认and 变成or
q.children.append(('price',220))
q.children.append(('name','鞋子爆款'))
res = models.Product.objects.filter(q) #Q对象查询默认也是and
print(res) #<QuerySet [<Product: 商品对象的名字:上衣爆款>, <Product: 商品对象的名字:鞋子爆款>]>

事务  事务的ACID

原子性 一致性 隔离性 持久性

    from django.db import transaction
from django.db.models import F
with transaction.atomic():
#在with代码块写你的事务操作
models.Product.objects.filter(id=1).update(stock=F('stock')-11)
models.Product.objects.filter(id=1).update(sell_out=F('sell_out')+11)

only与defer 拿到的是一个对象  两者是相反的

    res = models.Product.objects.values('name')
print(res) #查询数据库一次 res = models.Product.objects.only('name')
for i in res:
print(i.name)
#查询一次 数据库 res = models.Product.objects.defer('name')
for i in res:
print(i.name) #查询5次 数据库

 自定义的字段  以及映射关系 (字段  如:男 女 或者爱好之类的)

from django.db import models

# Create your models here.
class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
super().__init__(max_length=max_length,*args,**kwargs) def db_type(self, connection):
return 'char(%s)'%self.max_length class Product(models.Model):
name = models.CharField(max_length=32) #都是类实例化出来的对象
price = models.DecimalField(max_digits=8,decimal_places=2)
sell_out = models.IntegerField()
stock = models.IntegerField() #自定义字段类型
info = MyCharField(max_length=32,null=True) #该字段可以为空 choices = ((1,'男'),(2,'女'),(3,'其他'))
gender = models.IntegerField(choices=choices,default=2) def __str__(self):
return '商品对象的名字:%s'%self.name

模型

获取的时候 get_字段_display()

res = models.Product.filter(id=1).first()
print(res.gender) #
print(res.get_gender_display()) #女 获取编号对应的中文注释 固定用法 get_字段_display()

update()与save()的区别

  两者都是对数据的修改保存操作,但是save()函数是将数据列的全部数据项全部重新写一遍,而update()则是针对修改的项进行针对的更新效率高耗时少

  所以以后对数据的修改保存用update()

 字段合集

AutoField(Field)
- int自增列,必须填入参数 primary_key=True BigAutoField(AutoField)
- bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列
from django.db import models class UserInfo(models.Model):
# 自动创建一个列名为id的且为自增的整数列
username = models.CharField(max_length=32) class Group(models.Model):
# 自定义自增列
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32) SmallIntegerField(IntegerField):
- 小整数 -32768 ~ 32767 PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正小整数 0 ~ 32767
IntegerField(Field)
- 整数列(有符号的) -2147483648 ~ 2147483647 PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
- 正整数 0 ~ 2147483647 BigIntegerField(IntegerField):
- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807 BooleanField(Field)
- 布尔值类型 NullBooleanField(Field):
- 可以为空的布尔值 CharField(Field)
- 字符类型
- 必须提供max_length参数, max_length表示字符长度 TextField(Field)
- 文本类型 EmailField(CharField):
- 字符串类型,Django Admin以及ModelForm中提供验证机制 IPAddressField(Field)
- 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field)
- 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
- 参数:
protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both" URLField(CharField)
- 字符串类型,Django Admin以及ModelForm中提供验证 URL SlugField(CharField)
- 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) CommaSeparatedIntegerField(CharField)
- 字符串类型,格式必须为逗号分割的数字 UUIDField(Field)
- 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证 FilePathField(Field)
- 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
- 参数:
path, 文件夹路径
match=None, 正则匹配
recursive=False, 递归下面的文件夹
allow_files=True, 允许文件
allow_folders=False, 允许文件夹 FileField(Field)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage ImageField(FileField)
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field=None, 上传图片的高度保存的数据库字段名(字符串)
height_field=None 上传图片的宽度保存的数据库字段名(字符串) DateTimeField(DateField)
- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField(DateTimeCheckMixin, Field)
- 日期格式 YYYY-MM-DD TimeField(DateTimeCheckMixin, Field)
- 时间格式 HH:MM[:ss[.uuuuuu]] DurationField(Field)
- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型 FloatField(Field)
- 浮点型 DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度 BinaryField(Field)
- 二进制类型 字段合集
对应关系:
'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)', ORM字段与MySQL字段对应关系

orm字段与mysql字段对应关系

字段参数

  null    用于表示某个字段可以为空

  unique   如果设置unique=True 则该字段在此表中必须是唯一的

  db_indx  如果db_index=True 则代表着为此字段设置索引

  default  为该字段设置默认值

DateField和DateTimeField

  auto_now_add    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

  auto_now      配置上auto_now=True,每次更新数据记录的时候会更新该字段。

ForignKey 

  外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。ForeignKey可以和其他表做关联关系同时也可以和自身

做关联关系。

  字段参数

  to        设置要关联的表

  on_delete   当删除关联表中的数据时,当前表与其关联的行为的行为

  models.CASCADE  删除关联数据,与之关联也删除

  db_constraint    是否在数据库中创建外界约束,默认是True

models.DO_NOTHING
删除关联数据,引发错误IntegrityError models.PROTECT
删除关联数据,引发错误ProtectedError models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空) models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值) models.SET 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) 其余字段参数

其余字段参数

def func():
return 10 class MyModel(models.Model):
user = models.ForeignKey(
to="User",
to_field="id",
on_delete=models.SET(func)
)

 

django F与Q查询 事务 only与defer的更多相关文章

  1. F与Q查询 事务 choices参数

    F与Q查询 F查询 当我们需要将两个字段对应的数据进行比较时就需要用到F查询. select * from book where sold > stock 1.例如需要将售出部分数据和库存数据进 ...

  2. Django ORM 之F、Q查询与事务

    返回ORM目录 Django ORM 内容目录 一.F.Q查询 二.事务 三.only与defer 一.F.Q查询 """ Product表中的数据: 1 橡皮 2 20 ...

  3. django之 F与Q查询

    F与Q查询 F查询 why?

  4. Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)

    Django 08 Django模型基础3(关系表的数据操作.表关联对象的访问.多表查询.聚合.分组.F.Q查询) 一.关系表的数据操作 #为了能方便学习,我们进入项目的idle中去执行我们的操作,通 ...

  5. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  6. django基础之day05,F与Q查询,Q查询的高级用法

    #F与Q查询 #*************************** F 查询 ******************** # F 查询数据库中的其他字段!!! #1.查询库存数大于卖出数的书籍 fr ...

  7. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  8. Django 聚合分组F与Q查询及choices

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  9. 70 多表查询的分组F 聚合 Q 查询

    聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...

随机推荐

  1. Python数据抓取(2) —简单网络爬虫的撰写

    (一)使用Requests存储网页 Requests 是什么?网络资源(URLs)抓取套件 优点? 改善urllib2的缺点,让使用者以最简单的方式获取网络资源 可以使用REST操作(POST,PUT ...

  2. addEventListener 事件监听器 冒泡事件)

    addEventListener 事件监听器 (冒泡事件)   1.后面绑定的事件照样会执行 2.不会被覆盖 3.调用者是事件源but.addEventListener 4.参数1,事件名(不带on ...

  3. IO之复制文件的四种方式

    1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是 ...

  4. IntelliJ IDEA 2017.3 多模块右边栏 maven projects,maven项目命名问题

    我新建了一个maven web 模块,命名为cloud-access,可是install的时候,名字突然变为cloud-access Maven Webapp了,我就纳闷了,怎么回事.找了很久没发现原 ...

  5. IDEA个人常用配置记录

    原文 一.常用快捷键 编辑 ⇧ + ↩:开始新的一行 ⌘ + ⇧ + ↩:行内任意位置进行换行,并自动补齐“;”.“{}” ⌘ + ⇧ + U:大小写切换 ⌥ + ⌦:删除到单词的末尾(⌦键为Fn+D ...

  6. shell脚本编程进阶

    在linux shell中,通常我们将一些命令写在一个文件中就算是一个shell脚本了,但是如果需要执行更为复杂的逻辑判断,我们就需要使用流程控制语句来支持了.所谓流程控制既是通过使用流程控制语句对程 ...

  7. antd源码分析之——栅格(Grid)

    官方文档 https://ant.design/components/grid-cn/ 目录 一.antd中的Grid 代码目录 1.整体思路 2.less文件结构图(♦♦♦重要) 3.less实现逻 ...

  8. 前端知识点回顾——Javascript篇(五)

    DOM 常用的DOM获取方法: node.children 返回子元素节点,没有兼容性问题,动态获取 node.parentNode 获取父节点,没有兼容性问题 node.offsetParent 获 ...

  9. 自定义vue-cli生成项目模板配置(1)

    最近在读<变量>,目前得到的认知之一:慢变量才是决定事物长期发展的因素. 打算自定义vue-cli的脚手架或者根据自己的需要设置项目模板的相关参数,很大程度与慢变量这个概念相关. 当然,我 ...

  10. linux下如何查看某个容器的详细信息?

    答: 使用docker inspect <CONTAINER ID>即可