Django---ORM操作大全
前端之家收集整理的这篇文章主要介绍了
Django---ORM操作大全,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
<div id="cnblogs_post_body">
前言
Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架
到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:
ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first)
ORM:Object Relational Mapping(关系对象映射)
类名对应------》数据库中的表名
类属性对应---------》数据库里的字段
类实例对应---------》数据库表里的一行数据
obj.id obj.name.....类实例对象的属性
Django orm的优势:
Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MysqL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可;
1、创建数据库 (
自带的orm是data_first类型的ORM,使用前必须先创建数据库
create database day70 default character set utf8 collate utf8_general_ci;
2、修改project中的settings.py文件中设置 连接 MysqL数据库(Django默认使用的是sqllite数据库)
DATABASES =: MysqL:: : : :
扩展:查看orm操作执行的原生sql语句
在project中的settings.py文件增加
LOGGING =: 1::: [:
3、修改project 中的__init__py 文件设置 Django默认连接MysqL的方式
MysqL
pyMysqL.install_as_MysqLdb()
4、setings文件注册APP
INSTALLED_APPS =
5、models.py创建表
6、进行数据迁移
6.1、在winds cmd或者Linux shell的项目的manage.py目录下执行
python manage.py migrate
扩展:修改表之后常见报错

这个报错:因为表创建好之后,,或者,修改后的表结构和目前的数据冲突导致;
二、modles.py创建表
ORM字段介绍
Djan提供了很多字段类型,比如URL/Email/IP/ 但是MysqL数据没有这些类型,这类型存储到数据库上本质是字符串数据类型,其主要目的是为了封装底层sql语句;
1、字符串类(以下都是在数据库中本质都是字符串数据类型,此类字段只是在Django自带的admin中生效)
name=models.CharField(max_length=32)
扩展
MysqL的varchar数据类型
char 和 varchar的区别 :
char和varchar的共同点是存储数据的长度,不能 超过max_length限制,
不同点是varchar根据数据实际长度存储,char按指定max_length()存储数据;所有前者更节省硬盘空间;
2、时间字段
models.DateTimeField(null=True)
date=models.DateField()
3、数字字段
==price=models.DecimalField(max_digits=8,decimal_places=3) 精确浮点
4、枚举字段
choice=1,2,3,=models.IntegerField(choices=choice)
扩展
在数据库存储枚举类型,比外键有什么优势?
1、无需连表查询性能低,省硬盘空间(选项不固定时用外键)
2、在modle文件里不能动态增加(选项一成不变用Django的choice)
其他字段
联合唯一索引
<span style="color: #0000ff;">class<span style="color: #000000;"> Meta:
unique_together =<span style="color: #000000;"> (
(<span style="color: #800000;">'<span style="color: #800000;">email<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">ctime<span style="color: #800000;">'<span style="color: #000000;">),)
联合索引(不做限制)
index_together =<span style="color: #000000;"> (
(<span style="color: #800000;">'<span style="color: #800000;">email<span style="color: #800000;">',)
ManyToManyField(RelatedField)
字段参数介绍
1.数据库级别生效

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


=help_text=<span style="color: #800000;">"<span style="color: #800000;">
提示信息<span style="color: #800000;">"<span style="color: #000000;">
提示信息
choices=<span style="color: #000000;">choice 提供下拉框
error_messages=<span style="color: #800000;">"<span style="color: #800000;">
错误信息<span style="color: #800000;">"<span style="color: #000000;">
错误信息
validators 自定义错误验证(列表类型),从而定制想要的验证规则
<span style="color: #0000ff;">from django.core.validators <span style="color: #0000ff;">import<span style="color: #000000;"> RegexValidator
<span style="color: #0000ff;">from django.core.validators <span style="color: #0000ff;">import<span style="color: #000000;"> EmailValidator,URLValidator,DecimalValidator,\
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test =<span style="color: #000000;"> models.CharField(
max_length=32<span style="color: #000000;">,errormessages=<span style="color: #000000;">{
<span style="color: #800000;">'<span style="color: #800000;">c1<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">优先错信息1<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">c2<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">优先错信息2<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">c3<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">优先错信息3<span style="color: #800000;">'<span style="color: #000000;">,validators=<span style="color: #000000;">[
RegexValidator(regex=<span style="color: #800000;">'<span style="color: #800000;">root\d+<span style="color: #800000;">',message=<span style="color: #800000;">'<span style="color: #800000;">错误了<span style="color: #800000;">',code=<span style="color: #800000;">'<span style="color: #800000;">c1<span style="color: #800000;">'<span style="color: #000000;">),RegexValidator(regex=<span style="color: #800000;">'<span style="color: #800000;">root_112233\d+<span style="color: #800000;">',message=<span style="color: #800000;">'<span style="color: #800000;">又错误了<span style="color: #800000;">',code=<span style="color: #800000;">'<span style="color: #800000;">c2<span style="color: #800000;">'<span style="color: #000000;">),EmailValidator(message=<span style="color: #800000;">'<span style="color: #800000;">又错误了<span style="color: #800000;">',code=<span style="color: #800000;">'<span style="color: #800000;">c3<span style="color: #800000;">'),]
三、ORM单表操作
0、orm操作前戏
QuerySet数据类型介绍
QuerySet与惰性机制
所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用QuerySet的时候才执行。
QuerySet特点:
<1> 可迭代的
<2> 可切片
惰性计算和缓存机制


=models.Book.objects.all()[:10] 分页
books = models.Book.objects.all()[::2= models.Book.objects.all()[6]
obj books:
=models.Book.objects.all() 等于一个生成器,不应用books不会执行任何sql操作
数据库查询结果query_set都会对应一块缓存,再次使用该query_set时,不会发生新的sql操作;
数据库给数据库带来的压力;
authors= author (=1).update(name= author 解决这个问题;
HttpResponse()
增加和查询操作
增


添加一条记录的方法
单表
1=,addr===,sex=,age=89,university=2、类实例化:obj=类(属性==models.Author(name=,age=518,university=1对多
</span>1<span style="color: #000000;">、表.objects.create()
models.Book.objects.create(title</span>=<span style="color: #800000;">'</span><span style="color: #800000;">笑傲江湖</span><span style="color: #800000;">'</span>,price=200,date=1968,classify_id=6,publish_id=6<span style="color: #000000;">)
</span>2、类实例化:obj=类(<a href="/tag/shuxing/" target="_blank" class="keywords">属性</a>=X,外键=<span style="color: #000000;">obj)obj.save()
classify_obj</span>=models.Classify.objects.get(category=<span style="color: #800000;">'</span><span style="color: #800000;">武侠</span><span style="color: #800000;">'</span><span style="color: #000000;">)
publish_obj</span>=models.Publish.objects.get(name=<span style="color: #800000;">'</span><span style="color: #800000;">河北出版社</span><span style="color: #800000;">'</span><span style="color: #000000;">)
注意以上<a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>得是和 book对象 向关联的(外键)的对象
book_obj</span>=models.Book(title=<span style="color: #800000;">'</span><span style="color: #800000;">西游记</span><span style="color: #800000;">'</span>,price=234,date=1556,classify=classify_obj,publish=<span style="color: #000000;">publish_obj)
book_obj.save()
多对多
如果两表之间存在双向1对N关系,就无法使用外键来描述其关系了;
只能使用多对多的方式,新增第三张表关系描述表;
book</span>=models.Book.objects.get(title=<span style="color: #800000;">'</span><span style="color: #800000;">笑傲江湖</span><span style="color: #800000;">'</span><span style="color: #000000;">)
author1</span>=models.Author.objects.get(name=<span style="color: #800000;">'</span><span style="color: #800000;">金庸</span><span style="color: #800000;">'</span><span style="color: #000000;">)
author2</span>=models.Author.objects.get(name=<span style="color: #800000;">'</span><span style="color: #800000;">张根</span><span style="color: #800000;">'</span><span style="color: #000000;">)
book.author.add(author1,author2)
书籍和作者是多对多关系,
切记:如果两表之间存在多对多关系,例如书籍相关的所有作者对象集合,作者也关联的所有书籍对象集合
book</span>=models.Book.objects.get(title=<span style="color: #800000;">'</span><span style="color: #800000;">西游记</span><span style="color: #800000;">'</span><span style="color: #000000;">)
author</span>=models.Author.objects.get(name=<span style="color: #800000;">'</span><span style="color: #800000;">吴承恩</span><span style="color: #800000;">'</span><span style="color: #000000;">)
author2 </span>= models.Author.objects.get(name=<span style="color: #800000;">'</span><span style="color: #800000;">张根</span><span style="color: #800000;">'</span><span style="color: #000000;">)
book.author.add(author,author2)
</span><span style="color: #008000;">#</span><span style="color: #008000;">add() <a href="/tag/tianjia/" target="_blank" class="keywords">添加</a></span>
<span style="color: #008000;">#</span><span style="color: #008000;">clear() 清空</span>
<span style="color: #008000;">#</span><span style="color: #008000;">remove() <a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>某个对象</span>
<span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">OK</span><span style="color: #800000;">'</span>)</pre>
删


删除
为防止读者跑路,不再赘述!
改


修改方式1 update()
models.Book.objects.filter(id=1).update(price=3</span><span style="color: #008000;">#</span><span style="color: #008000;"><a href="/tag/xiugai/" target="_blank" class="keywords">修改</a>方式2 obj.save() </span>
book_obj=models.Book.objects.get(id=1<span style="color: #000000;">)
book_obj.price</span>=5<span style="color: #000000;">
book_obj.save()</span></pre>
查


=models.Book.objects.all()
books=models.Book.objects.filter(id__gt=2,price__lt=100=models.Book.objects.get(title__endswith=)
book1 = models.Book.objects.filter(title__endswith== models.Book.objects.filter(title__icontains==models.Book.objects.values(,,
,
,
,
books</span>=models.Book.objects.values(<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">publish__name</span><span style="color: #800000;">'</span><span style="color: #000000;">).distinct()
</span><span style="color: #008000;">#</span><span style="color: #008000;">exclude 按条件排除。。。</span>
<span style="color: #008000;">#</span><span style="color: #008000;">distinct()去重,exits()查看数据是否存在? 返回 true 和false</span>
a=models.Book.objects.filter(title__icontains=<span style="color: #800000;">'</span><span style="color: #800000;">金</span><span style="color: #800000;">'</span><span style="color: #000000;">).
</span><span style="color: #0000ff;">return</span> HttpResponse(<span style="color: #800000;">'</span><span style="color: #800000;">OK</span><span style="color: #800000;">'</span>)</pre>
连表查询


查询:
1=models.Publish.objects.filter(name__contains== book = models.Author.objects.filter(id=1=*</span>2、通过values双下滑线的形式,objs.values(<span style="color: #800000;">"</span><span style="color: #800000;">小写表名__字段</span><span style="color: #800000;">"</span><span style="color: #000000;">)
注意对象集合<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>values(),正向<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>是外键字段__XX,而反向是小写表名__YY看起来比较容易混淆;
books</span>=models.Publish.objects.filter(name__contains=<span style="color: #800000;">'</span><span style="color: #800000;">湖南</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">book__title</span><span style="color: #800000;">'</span><span style="color: #000000;">)
authors</span>=models.Book.objects.filter(title__icontains=<span style="color: #800000;">'</span><span style="color: #800000;">我的</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">author__name</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(authors)
fifter()也<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a>__小写表名语法进行连表<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>:在publish标<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a> 出版过《笑傲江湖》的出版社
publishs</span>=models.Publish.objects.filter(book__title=<span style="color: #800000;">'</span><span style="color: #800000;">笑傲江湖</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(publishs)
<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>谁(哪位作者)出版过的书价格大于200元
authors</span>=models.Author.objects.filter(book__price__gt=200).values(<span style="color: #800000;">'</span><span style="color: #800000;">name</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(authors)
通过外键字段正向连表<a href="/tag/chaxun/" target="_blank" class="keywords">查询</a>,出版自保定的书籍;
city</span>=models.Book.objects.filter(publish__addr__icontains=<span style="color: #800000;">'</span><span style="color: #800000;">保定</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">title</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span>(city)</pre>
1、基本操作


增加一条数据,可以接受字典类型数据 **kwargs
<span style="color: #008000;">#</span><span style="color: #008000;"> obj = models.Tb1(c1='xx',c2='oo')</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.save()</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 查</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.get(id=123) # 获取单条数据,不存在则报错(不建议)
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all() #
获取全部
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven') #
获取指定条件的数据
<span style="color: #008000;">#</span><span style="color: #008000;"> 删</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
<span style="color: #008000;">#</span><span style="color: #008000;"> 改</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> models.Tb1.objects.filter(name='seven').update(gender='0') # 将指定条件的数据更新,均<a href="/tag/zhichi/" target="_blank" class="keywords">支持</a> **kwargs</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj = models.Tb1.objects.get(id=1)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.c1 = '111'</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> obj.save() # <a href="/tag/xiugai/" target="_blank" class="keywords">修改</a>单条数据</span>
<span style="color: #000000;">
基本操作
2、进阶操作(了不起的双下划线)
利用双下划线将字段和对应的操作连接起来


4040da83bc" class="cnblogs_code_hide">
获取个数
<span style="color: #008000;">#</span><span style="color: #008000;"> 大于,小于</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idgt=1) # 获取id大于1的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idlt=10) # 获取id小于10的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idlt=10,idgt=1) # 获取id大于1 且 小于10的值
<span style="color: #008000;">#</span><span style="color: #008000;"> in</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__in=[11,22,33]) # 获取id等于11、22、33的数据
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(id__in=[11,33]) # not in
<span style="color: #008000;">#</span><span style="color: #008000;"> isnull</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> Entry.objects.filter(pub_date__isnull=True)</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> contains</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(namecontains="ven")
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(nameicontains="ven") # icontains大小写不敏感
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(name__icontains="ven")
<span style="color: #008000;">#</span><span style="color: #008000;"> range</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__range=[1,2]) # 范围bettwen and
<span style="color: #008000;">#</span><span style="color: #008000;"> 其他类似</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> startswith,istartswith,endswith,iendswith,
<span style="color: #008000;">#</span><span style="color: #008000;"> order by</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').order_by('id') # asc
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').order_by('-id') # desc
<span style="color: #008000;">#</span><span style="color: #008000;"> group by</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> from django.db.models import Count,Min,Max,Sum
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
<span style="color: #008000;">#<span style="color: #008000;"> SELECT "app01_tb1"."id",COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
<span style="color: #008000;">#</span><span style="color: #008000;"> limit 、offset</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all()[10:20]
<span style="color: #008000;">#</span><span style="color: #008000;"> regex正则匹配,iregex 不区分大小写</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.get(titleregex=r'^(An?|The) +')
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.get(titleiregex=r'^(an?|the) +')
<span style="color: #008000;">#</span><span style="color: #008000;"> date</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__date=datetime.date(2005,1,1))
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datedategt=datetime.date(2005,1))
<span style="color: #008000;">#</span><span style="color: #008000;"> year</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__year=2005)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_dateyeargte=2005)
<span style="color: #008000;">#</span><span style="color: #008000;"> month</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__month=12)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datemonthgte=6)
<span style="color: #008000;">#</span><span style="color: #008000;"> day</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_date__day=3)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_datedaygte=3)
<span style="color: #008000;">#</span><span style="color: #008000;"> week_day</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_dateweek_day=2)
<span style="color: #008000;">#<span style="color: #008000;"> Entry.objects.filter(pub_dateweek_day__gte=2)
<span style="color: #008000;">#</span><span style="color: #008000;"> hour</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphour=23)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timehour=5)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphourgte=12)
<span style="color: #008000;">#</span><span style="color: #008000;"> minute</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminute=29)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timeminute=46)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminutegte=29)
<span style="color: #008000;">#</span><span style="color: #008000;"> second</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecond=31)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timesecond=2)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecondgte=31)
<span style="color: #000000;">
进阶操作
3、其他操作


%s"},select_params=(1,))
%s"},),order_by=['-nid'])
<span style="color: #008000;">#</span><span style="color: #008000;"> F</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> from django.db.models import F
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.update(num=F('num')+1)
<span style="color: #008000;">#</span><span style="color: #008000;"> Q</span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> 方式一:
<span style="color: #008000;">#<span style="color: #008000;"> Q(nidgt=10)
<span style="color: #008000;">#<span style="color: #008000;"> Q(nid=8) | Q(nidgt=10)
<span style="color: #008000;">#<span style="color: #008000;"> Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root')
<span style="color: #008000;">#<span style="color: #008000;"> 方式二:
<span style="color: #008000;">#<span style="color: #008000;"> con = Q()
<span style="color: #008000;">#<span style="color: #008000;"> q1 = Q()
<span style="color: #008000;">#<span style="color: #008000;"> q1.connector = 'OR'
<span style="color: #008000;">#<span style="color: #008000;"> q1.children.append(('id',1))
<span style="color: #008000;">#<span style="color: #008000;"> q1.children.append(('id',10))
<span style="color: #008000;">#<span style="color: #008000;"> q1.children.append(('id',9))
<span style="color: #008000;">#<span style="color: #008000;"> q2 = Q()
<span style="color: #008000;">#<span style="color: #008000;"> q2.connector = 'OR'
<span style="color: #008000;">#<span style="color: #008000;"> q2.children.append(('c1',1))
<span style="color: #008000;">#<span style="color: #008000;"> q2.children.append(('c1',10))
<span style="color: #008000;">#<span style="color: #008000;"> q2.children.append(('c1',9))
<span style="color: #008000;">#<span style="color: #008000;"> con.add(q1,'AND')
<span style="color: #008000;">#<span style="color: #008000;"> con.add(q2,'AND')
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(con)
<span style="color: #008000;">#</span><span style="color: #008000;"> 执行原生<a href="/tag/sql/" target="_blank" class="keywords">sql</a></span>
<span style="color: #008000;">#
<span style="color: #008000;">#<span style="color: #008000;"> from django.db import connection,connections
<span style="color: #008000;">#<span style="color: #008000;"> cursor = connection.cursor() # cursor = connections['default'].cursor()
<span style="color: #008000;">#<span style="color: #008000;"> cursor.execute("""SELECT * from auth_user where id = %s""",[1])
<span style="color: #008000;">#<span style="color: #008000;"> row = cursor.fetchone()
<span style="color: #000000;">
其他操作
四、ORM连表操作
我们在学习django中的orm的时候,我们可以把一对多,多对多,分为正向和反向查找两种方式。
正向查找:ForeignKey在 UserInfo表中,如果从UserInfo表开始向其他的表进行查询,这个就是正向操作,反之如果从UserType表去查询其他的表这个就是反向操作。
- 一对多:models.ForeignKey(其他表)
- 多对多:models.ManyToManyField(其他表)
- 一对一:models.OneToOneField(其他表)
正向连表操作总结:
所谓正、反向连表操作的认定无非是Foreign_Key字段在哪张表决定的,
Foreign_Key字段在哪张表就可以哪张表使用Foreign_Key字段连表,反之没有Foreign_Key字段就使用与其关联的 小写表名;
反向连表操作总结:
方式反向跨表:小写表名__关联表字段
应用场景:
一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。
多对多:在某表中创建一行数据是,有一个可以多选的下拉框
例如:创建用户信息,需要为用户指定多个爱好

一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了
例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据
1、1对多
如果条记录成立,两表之间就是1对多关系;在1对多关系中 ,B表为子表,;
如果B表的1条记录也对应A表中N条记录,两表之间就是双向1对多关系,也称为多对多关系;
在orm中设置如果 A表设置了外键字段user=models.ForeignKey('UserType')到B表(注意外键表名加引号)
就意味着 写在写A表的B表主键, (一列),代表B表的多个(一行)称为1对多,
查询
总结:利用orm获取 数据库表中多个数据
获取到的数据类型本质上都是 queryset类型,
类似于列表,
内部有3种表现形式(对象,字典,列表)
modle.表名.objects.all()
modle.表名.objects.values()
modle.表名.objects.values()
跨表
正操作
所以表间只要有外键关系就可以一直点下去。。。点到天荒地老
所以可以通过obj.外键.B表的列表跨表操作(注意!!orm连表操作必须选拿单个对象,不像sql中直接表和表join就可以了)
print(obj.cls.title)
foreignkey字段在那个表里,那个表里一个"空格"代表那个表的多个(一行)
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" onclick="copyCnblogsCode(this)" href="javascript:void(0);">
= models.CharField(max_length=32= models.BigAutoField(primary_key== models.CharField(max_length=32= models.CharField(max_length=64= models.IntegerField(default=1
ug = models.ForeignKey(,null=True)
1. 在取得时候跨表
q = UserInfo.objects.all().first()
q.ug.title
2. 在查的时候就跨表了
UserInfo.objects.values('nid','ug_id')
UserInfo.objects.values('nid','ug_id','ug__title')
3. UserInfo.objects.values_list('nid','ug__title')
反向连表:
反向操作无非2种方式:
1. 小写的表名_set 得到有外键关系的对象
obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo对象,userinfo对象,]
2. 小写的表名 得到有外键关系的列 #因为使用values取值取得是字典的不是对象,所以需要 小写表名(外键表)__
v = UserGroup.objects.values('id','title')
v = UserGroup.objects.values('id','title','小写的表名称')
v = UserGroup.objects.values('id','小写的表名称__age')
3. 小写的表名 得到有外键关系的列
v = UserGroup.objects.values_list('id','title')
v = UserGroup.objects.values_list('id','小写的表名称')
v = UserGroup.objects.values_list('id','小写的表名称__age')
1对多自关联( 由原来的2张表,变成一张表!)
想象有第二张表,关联自己表中的 行


代码
评论表
= models.IntegerField()
content = models.CharField(max_length=32) 评论内容
user = models.CharField(max_length=32) 评论者
回复ID
2、 多对多:
1、自己写第3张关系表
ORM多对多查询:
女士表:

男生表:

男女关系表

多对跨表操作


获取方少伟有染的女孩
obj=models.Boy.objects.filter(name== row </span><span style="color: #008000;">#</span><span style="color: #008000;"> <a href="/tag/huoqu/" target="_blank" class="keywords">获取</a>和苍井空有染的男孩</span>
obj=models.Girl.objects.filter(nike=<span style="color: #800000;">'</span><span style="color: #800000;">苍井空</span><span style="color: #800000;">'</span><span style="color: #000000;">).first()
user_list</span>=<span style="color: #000000;">obj.love_set.all()
</span><span style="color: #0000ff;">for</span> row <span style="color: #0000ff;">in</span><span style="color: #000000;"> user_list:
</span><span style="color: #0000ff;">print</span>(row.b.name)</pre>
多对多关系表 数据查找思路
1、找到该对象
2.通过该对象 反向操作 找到第三张关系表
3.通过第三张关系表 正向操作 找到 和该对象有关系对象
总结(只要对象1和对象2 中间有关系表建立了关系; 对象1反向操作 到关系表,关系表正向操作到对象2,反之亦然
2、第3张关系表不用写(m=models.ManyToManyField(' 要关联的表') 自动生成 )

由于,但使用ManyToManyField字段生成 “第三张”关系表怎么操作它呢?
答案:通过单个objd对象 间接操作
<div class="cnblogs_code">


<div id="cnblogs_code_open_ff3b2b23-e968-4825-aff7-5965d0bb6294" class="cnblogs_code_hide">
= models.CharField(max_length=32= models.ManyToManyField(,through=,through_fields=(,<span style="color: #0000ff;">class<span style="color: #000000;"> Girl(models.Model):
nick = models.CharField(max_length=32<span style="color: #000000;">)
m = models.ManyToManyField(<span style="color: #800000;">'<span style="color: #800000;">Boy<span style="color: #800000;">')
正向操作:obj.m.all()


obj = models.Boy.objects.filter(name=22,4*[1obj.m.remove(</span>1<span style="color: #000000;">)
obj.m.remove(</span>2,3<span style="color: #000000;">)
obj.m.remove(</span>*[4<span style="color: #000000;">,])
obj.m.set([</span>1<span style="color: #000000;">,])
q </span>=<span style="color: #000000;"> obj.m.all()
</span><span style="color: #008000;">#</span><span style="color: #008000;"> [Girl对象]</span>
<span style="color: #0000ff;">print</span><span style="color: #000000;">(q)
obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;">'</span><span style="color: #800000;">方少伟</span><span style="color: #800000;">'</span><span style="color: #000000;">).first()
girl_list </span>=<span style="color: #000000;"> obj.m.all()
obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;">'</span><span style="color: #800000;">方少伟</span><span style="color: #800000;">'</span><span style="color: #000000;">).first()
girl_list </span>=<span style="color: #000000;"> obj.m.all()
girl_list </span>= obj.m.filter(nick=<span style="color: #800000;">'</span><span style="color: #800000;">小鱼</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">print</span><span style="color: #000000;">(girl_list)
obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;">'</span><span style="color: #800000;">方少伟</span><span style="color: #800000;">'</span><span style="color: #000000;">).first()
obj.m.clear()</span></pre>
反向操作 :obj.小写的表名_set
3、既自定义第三张关系表 也使用ManyToManyField('Boy')字段
ManyToManyField()字段创建第3张关系表,可以使用字段跨表查询,但无法直接操作第3张表,
自建第3表关系表可以直接操作,但无法通过字段 查询,我们可以把他们结合起来使用;
查询,也可以直接操作第3张关系表
查询和清空 方法
<div class="cnblogs_code">


<div id="cnblogs_code_open_f12b37d9-32e0-41a8-97ef-86fddcc5fe65" class="cnblogs_code_hide">
用户信息
= models.BigAutoField(primary_key== models.CharField(verbose_name=,max_length=32= models.CharField(max_length=11,unique=True,verbose_name== models.FileField(verbose_name=,upload_to== models.DateTimeField(verbose_name=,auto_now_add=fans </span>= models.ManyToManyField(verbose_name=<span style="color: #800000;">'</span><span style="color: #800000;">粉丝们</span><span style="color: #800000;">'</span><span style="color: #000000;">,to</span>=<span style="color: #800000;">'</span><span style="color: #800000;">UserInfo</span><span style="color: #800000;">'</span><span style="color: #000000;">,through</span>=<span style="color: #800000;">'</span><span style="color: #800000;">UserFans</span><span style="color: #800000;">'</span><span style="color: #000000;">,through_fields</span>=(<span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">follower</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.username
<span style="color: #0000ff;">class<span style="color: #000000;"> UserFans(models.Model):
<span style="color: #800000;">"""<span style="color: #800000;">
互粉关系表
<span style="color: #800000;">"""<span style="color: #000000;">
nid = models.AutoField(primary_key=<span style="color: #000000;">True)
user = models.ForeignKey(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">博主<span style="color: #800000;">',to=<span style="color: #800000;">'<span style="color: #800000;">UserInfo<span style="color: #800000;">',to_field=<span style="color: #800000;">'<span style="color: #800000;">nid<span style="color: #800000;">',related_name=<span style="color: #800000;">'<span style="color: #800000;">users<span style="color: #800000;">'<span style="color: #000000;">)
follower = models.ForeignKey(verbose_name=<span style="color: #800000;">'<span style="color: #800000;">粉丝<span style="color: #800000;">',related_name=<span style="color: #800000;">'<span style="color: #800000;">followers<span style="color: #800000;">'<span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
unique_together </span>=<span style="color: #000000;"> [
(</span><span style="color: #800000;">'</span><span style="color: #800000;">user</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">follower</span><span style="color: #800000;">'</span><span style="color: #000000;">),]
through=<span style="color: #800000;">'<span style="color: #800000;">UserFans<span style="color: #800000;">'<span style="color: #000000;">指定第3张关系表的表名
through_fields 指定第3张关系表的字段
<div class="cnblogs_code">


<div id="cnblogs_code_open_7794534e-3afc-446d-a521-93566ab17c1e" class="cnblogs_code_hide">
= models.CharField(max_length=32= models.ManyToManyField(,))
查询和清空
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Girl(models.Model):
nick </span>= models.CharField(max_length=32<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> m = models.ManyToManyField('Boy')</span>
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Love(models.Model):
b </span>= models.ForeignKey(<span style="color: #800000;">'</span><span style="color: #800000;">Boy</span><span style="color: #800000;">'</span><span style="color: #000000;">)
g </span>= models.ForeignKey(<span style="color: #800000;">'</span><span style="color: #800000;">Girl</span><span style="color: #800000;">'</span><span style="color: #000000;">)
</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> <a href="/tag/Meta/" target="_blank" class="keywords">Meta</a>:
unique_together </span>=<span style="color: #000000;"> [
(</span><span style="color: #800000;">'</span><span style="color: #800000;">b</span><span style="color: #800000;">'</span>,<span style="color: #800000;">'</span><span style="color: #800000;">g</span><span style="color: #800000;">'</span>),</pre>
外键反向查找别名(方便反向查找)
在写ForeignKey字段的时候,如果想要在反向查找时不使用默认的 小写的表名_set,就在定义这个字段的时间加related参数!
related_name、related_query_name 字段=什么别名 反向查找时就使用什么别名!
反向查找:
设置了related_query_name 反向查找时就是obj._set.all()
related_query_name


django.db <span style="color: #0000ff;">class<span style="color: #000000;"> Userinfo(models.Model):
nikename=models.CharField(max_length=32<span style="color: #000000;">)
username=models.CharField(max_length=32<span style="color: #000000;">)
password=models.CharField(max_length=64<span style="color: #000000;">)
sex=((1,<span style="color: #800000;">'<span style="color: #800000;">男<span style="color: #800000;">'),(2,<span style="color: #800000;">'<span style="color: #800000;">女<span style="color: #800000;">'<span style="color: #000000;">))
gender=models.IntegerField(choices=<span style="color: #000000;">sex)
<span style="color: #800000;">'''<span style="color: #800000;">把男女表混合在一起,在代码层面控制第三张关系表的外键关系 <span style="color: #800000;">'''
<span style="color: #008000;">#<span style="color: #008000;">写到此处问题就来了,原来两个外键 对应2张表 2个主键 可以识别男女
<span style="color: #008000;">#<span style="color: #008000;">现在两个外键对应1张表 反向查找 无法区分男女了了
<span style="color: #008000;">#<span style="color: #008000;"> object对象女.U2U.Userinfo.set object对象男.U2U.Userinfo.set
<span style="color: #008000;">#<span style="color: #008000;">所以要加related_query_name对 表中主键 加以区分
<span style="color: #008000;">#<span style="color: #008000;">查找方法
<span style="color: #008000;">#<span style="color: #008000;"> 男 obj.a._set.all()
<span style="color: #008000;">#<span style="color: #008000;"> 女:obj.b._set.all()
<span style="color: #0000ff;">class<span style="color: #000000;"> U2U(models.Model):
b=models.ForeignKey(Userinfo,related_query_name=<span style="color: #800000;">'<span style="color: #800000;">a<span style="color: #800000;">'<span style="color: #000000;">)
g=models.ForeignKey(Userinfo,related_query_name=<span style="color: #800000;">'<span style="color: #800000;">b<span style="color: #800000;">')
related_name
反向查找:
设置了relatedname就是 反向查找时就说obj.


django.db <span style="color: #0000ff;">class<span style="color: #000000;"> Userinfo(models.Model):
nikename=models.CharField(max_length=32<span style="color: #000000;">)
username=models.CharField(max_length=32<span style="color: #000000;">)
password=models.CharField(max_length=64<span style="color: #000000;">)
sex=((1,<span style="color: #800000;">'<span style="color: #800000;">女<span style="color: #800000;">'<span style="color: #000000;">))
gender=models.IntegerField(choices=<span style="color: #000000;">sex)
<span style="color: #800000;">'''<span style="color: #800000;">把男女表混合在一起,在代码层面控制第三张关系表的外键关系 <span style="color: #800000;">'''
<span style="color: #008000;">#<span style="color: #008000;">写到此处问题就来了,原来两个外键 对应2张表 2个主键 可以识别男女
<span style="color: #008000;">#<span style="color: #008000;">现在两个外键对应1张表 反向查找 无法区分男女了了
<span style="color: #008000;">#<span style="color: #008000;"> object对象女.U2U.Userinfo.set object对象男.U2U.Userinfo.set
<span style="color: #008000;">#<span style="color: #008000;">所以要加related_query_name设置反向查找命名对 表中主键 加以区分
<span style="color: #008000;">#<span style="color: #008000;">查找方法
<span style="color: #008000;">#<span style="color: #008000;"> 男 obj.a.all()
<span style="color: #008000;">#<span style="color: #008000;"> 女:obj.b.all()
<span style="color: #0000ff;">class<span style="color: #000000;"> U2U(models.Model):
b=models.ForeignKey(Userinfo,related_name=<span style="color: #800000;">'<span style="color: #800000;">a<span style="color: #800000;">'<span style="color: #000000;">)
g=models.ForeignKey(Userinfo,related_name=<span style="color: #800000;">'<span style="color: #800000;">b<span style="color: #800000;">')
操作


django.shortcuts app01
<span style="color: #0000ff;">def
<span style="color: #000000;"> index(request):
<span style="color: #008000;">#<span style="color: #008000;">查找 ID为1男孩 相关的女孩
boy_obj=models.Userinfo.objects.filter(id=1<span style="color: #000000;">).first()
res
= boy_obj.boy.all()<span style="color: #008000;">#<span style="color: #008000;">得到U2U的对象再 正向跨表
<span style="color: #008000;">#<span style="color: #008000;">原来跨表 boy_obj.小写表名.all()
<span style="color: #008000;">#<span style="color: #008000;"> 现在设置了related_name(别名) 直接res= boy_obj.boy.all()跨表
<span style="color: #0000ff;">for obj <span style="color: #0000ff;">in<span style="color: #000000;"> res:
<span style="color: #0000ff;">print<span style="color: #000000;">(obj.g.nikename)
<span style="color: #0000ff;">return HttpResponse(<span style="color: #800000;">'<span style="color: #800000;">OK<span style="color: #800000;">')
多对多自关联(由原来的3张表,变成只有2张表)
把两张表通过 choices字段合并为一张表
‘第三张关系表’ 使用models.ManyToManyField('Userinfo')生成
特性:
obj = models.UserInfo.objects.filter(id=1).first() 获取对象
1、查询第三张关系表前面那一列:obj.m
select xx from xx where from_userinfo_id = 1
2、查询第三张关系表后面那一列:obj.userinfo_set
select xx from xx where to_userinfo_id = 1
<div class="cnblogs_code">


<div id="cnblogs_code_open_f2994fff-a8c3-4bca-a71b-e69d50cfe7ce" class="cnblogs_code_hide">
=models.CharField(max_length=32=models.CharField(max_length=32=models.CharField(max_length=64=((1,=models.IntegerField(choices==models.ManyToManyField()
查找方法


查询女生
boy_obj=models.Userinfo.objects.filter(id=4= row HttpResponse(查询男生
girl_obj=models.Userinfo.objects.filter(id=4= obj HttpResponse()
多对多自关联特性:

ManyToManyField生成的第三张表



查询
obj_list
=<span style="color: #000000;">models.Love.objects.all()
<span style="color: #0000ff;">for row <span style="color: #0000ff;">in obj_list: <span style="color: #008000;">#<span style="color: #008000;">for循环10次发送10次
数据库查询请求
<span style="color: #0000ff;">print<span style="color: #000000;">(row.b.name)
这种查询方式第一次发送 查询请求每for循环一次也会发送查询请求
1<span style="color: #000000;">、select_related:结果为对象 注意query_set类型的对象 都有该方法
原理: 查询时主动完成连表形成一张大表,for循环时不用额外发请求;
试用场景: 节省硬盘空间,数据量少时候适用相当于做了一次数据库查询;
obj_list=models.Love.objects.all().select_related(<span style="color: #800000;">'<span style="color: #800000;">b<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">for row <span style="color: #0000ff;">in<span style="color: #000000;"> obj_list:
<span style="color: #0000ff;">print<span style="color: #000000;">(row.b.name)
2<span style="color: #000000;">、prefetch_related:结果都对象是
原理:虽好,但是做连表操作依然会影响查询性能,所以出现prefetch_related
prefetch_related:不做连表,多次单表查询外键表 去重之后显示, 2次单表查询(有几个外键做几次1+<span style="color: #000000;">N次单表查询,
适用场景:效率高,数据量大的时候试用
obj_list=models.Love.objects.all().prefetch_related(<span style="color: #800000;">'<span style="color: #800000;">b<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">for obj <span style="color: #0000ff;">in<span style="color: #000000;"> obj_list:
<span style="color: #0000ff;">print<span style="color: #000000;">(obj.b.name)
3<span style="color: #000000;">、update()和对象.save()修改方式的性能PK
修改方式1
models.Book.objects.filter(id=1).update(price=3<span style="color: #000000;">)
方式2
book_obj=models.Book.objects.get(id=1<span style="color: #000000;">)
book_obj.price=5<span style="color: #000000;">
book_obj.save()
执行结果:
(0.000) BEGIN; args=<span style="color: #000000;">None
(0.000) UPDATE <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">" SET <span style="color: #800000;">"<span style="color: #800000;">price<span style="color: #800000;">" = <span style="color: #800000;">'<span style="color: #800000;">3.000<span style="color: #800000;">' WHERE <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">" = 1; args=(<span style="color: #800000;">'<span style="color: #800000;">3.000<span style="color: #800000;">',1<span style="color: #000000;">)
(0.000) SELECT <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">price<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">date<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">publish_id<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">classify_id<span style="color: #800000;">" FROM <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">" WHERE <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">" = 1; args=(1<span style="color: #000000;">,)
(0.000) BEGIN; args=<span style="color: #000000;">None
(0.000) UPDATE <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">" SET <span style="color: #800000;">"<span style="color: #800000;">title<span style="color: #800000;">" = <span style="color: #800000;">'<span style="color: #800000;">我的奋斗<span style="color: #800000;">',<span style="color: #800000;">"<span style="color: #800000;">price<span style="color: #800000;">" = <span style="color: #800000;">'<span style="color: #800000;">5.000<span style="color: #800000;">',<span style="color: #800000;">"<span style="color: #800000;">date<span style="color: #800000;">" = <span style="color: #800000;">'<span style="color: #800000;">1370-09-09<span style="color: #800000;">',<span style="color: #800000;">"<span style="color: #800000;">publish_id<span style="color: #800000;">" = 4,<span style="color: #800000;">"<span style="color: #800000;">classify_id<span style="color: #800000;">" = 3 WHERE <span style="color: #800000;">"<span style="color: #800000;">app01_book<span style="color: #800000;">".<span style="color: #800000;">"<span style="color: #800000;">id<span style="color: #800000;">" = 1; args=(<span style="color: #800000;">'<span style="color: #800000;">我的奋斗<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">5.000<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">1370-09-09<span style="color: #800000;">',4,3,1<span style="color: #000000;">)
[31/Aug/2017 17:07:20] <span style="color: #800000;">"<span style="color: #800000;">GET /fandq/ HTTP/1.1<span style="color: #800000;">" 200 2<span style="color: #000000;">
结论:
update() 方式1修改数据的方式,比obj.save()性能好;
六、分组和聚合查询
1、aggregate(*args,**kwargs) 聚合函数
通过对QuerySet进行计算,返回一个聚合值的字典。aggregate()中每一个参数都指定一个包含在字典中的返回值。即在查询集上生成聚合。


django.db.models
ret=models.Book.objects.all().aggregate(Avg(
<span style="color: #008000;">#</span><span style="color: #008000;">参与西游记著作的作者中最老的一位作者</span>
ret=models.Book.objects.filter(title__icontains=<span style="color: #800000;">'</span><span style="color: #800000;">西游记</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">author__age</span><span style="color: #800000;">'</span>).aggregate(Max(<span style="color: #800000;">'</span><span style="color: #800000;">author__age</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;">{'author__age__max': 518}</span>
<span style="color: #008000;">#</span><span style="color: #008000;">查看根哥出过得书中价格最贵一本</span>
ret=models.Author.objects.filter(name__contains=<span style="color: #800000;">'</span><span style="color: #800000;">根</span><span style="color: #800000;">'</span>).values(<span style="color: #800000;">'</span><span style="color: #800000;">book__price</span><span style="color: #800000;">'</span>).aggregate(Max(<span style="color: #800000;">'</span><span style="color: #800000;">book__price</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;">{'book__price__max': Decimal('234.000')}</span></pre>
2、annotate(*args,**kwargs) 分组函数


ret=models.Book.objects.values().annotate(Max(
<span style="color: #008000;">#</span><span style="color: #008000;">查看每本书的作者中最老的 按作者姓名分组 分别求出每组中年龄最大的</span>
ret=models.Book.objects.values(<span style="color: #800000;">'</span><span style="color: #800000;">author__name</span><span style="color: #800000;">'</span>).annotate(Max(<span style="color: #800000;">'</span><span style="color: #800000;">author__age</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> < QuerySet[</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '吴承恩','author__age__max': 518},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '张X','author__age__max': 18},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> { 'author__name': '张X杰','author__age__max': 56},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '方X伟','author__age__max': 26},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '游X兵','author__age__max': 35},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '金庸','author__age__max': 89},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> { 'author__name': 'X涛','author__age__max': 27},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'author__name': '高XX','author__age__max': 26}</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> ] ></span>
<span style="color: #008000;">#</span><span style="color: #008000;">查看 每个出版社 出版的最便宜的一本书</span>
ret=models.Book.objects.values(<span style="color: #800000;">'</span><span style="color: #800000;">publish__name</span><span style="color: #800000;">'</span>).annotate(Min(<span style="color: #800000;">'</span><span style="color: #800000;">price</span><span style="color: #800000;">'</span><span style="color: #000000;">))
</span><span style="color: #008000;">#</span><span style="color: #008000;"> < QuerySet[</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '北大出版社','price__min': Decimal('67.000')},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '山西出版社','price__min': Decimal('34.000')},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '河北出版社','price__min': Decimal('123.000')},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '浙江出版社','price__min': Decimal('2.000')},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '湖北出版社','price__min': Decimal('124.000')},</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> {'publish__name': '湖南出版社',price__min': Decimal('15.000')}</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> ] ></span></pre>
仅仅靠单一的关键字参数查询已经很难满足查询要求。此时Django为我们提供了F和Q查询:
1、F 可以获取对象中的字段的属性(列),并对其进行操作;
django.db.models 获取对象中的字段的属性(列),并且对其进行操作;
models.Book.objects.all().update(price=F()+1) #对图书馆里的每一本书的价格 上调1块钱
2、Q多条件组合查询
Q()可以使orm的fifter()方法支持, 多个查询条件,使用逻辑关系(&、|、~)包含、组合到一起进行多条件查询;
语法:
fifter(Q(查询条件1)| Q(查询条件2))
fifter(Q(查询条件2)& Q(查询条件3))
fifter(Q(查询条件4)& ~Q(查询条件5))
fifter(Q(查询条件6)| Q(Q(查询条件4)& ~ Q(Q(查询条件5)& Q(查询条件3)))包含


django.db.models 1获取对象中的字段的属性(列),并且对其进行操作;
2查询
查询条件 涉及到逻辑使用 fifter(,隔开)可以表示与,但没法表示或非得关系
查询 书名包含作者名的书
book=models.Book.objects.filter(title__icontains=,author__name__contains=).values(支持逻辑判断+多条件查询? Q()登场
book=models.Book.objects.filter(Q(title__icontains=) & Q(author__name__contains=)).values(=models.Book.objects.filter(Q(author__name__contains=) & ~Q(title__icontains=)).values(<span style="color: #008000;">#<span style="color: #008000;">多条件包含组合查询
<span style="color: #008000;">#<span style="color: #008000;">查询作者姓名中包含 方/少/伟/书名包含伟3字 并且出版社地址以山西开头的书
book=<span style="color: #000000;">models.Book.objects.filter(
Q(
Q(authornamecontains=<span style="color: #800000;">'<span style="color: #800000;">方<span style="color: #800000;">') |<span style="color: #000000;">
Q(authornamecontains=<span style="color: #800000;">'<span style="color: #800000;">少<span style="color: #800000;">') |<span style="color: #000000;">
Q(titleicontains=<span style="color: #800000;">'<span style="color: #800000;">伟<span style="color: #800000;">')|<span style="color: #000000;">
Q(authornamecontains=<span style="color: #800000;">'<span style="color: #800000;">伟<span style="color: #800000;">'<span style="color: #000000;">)
)
&<span style="color: #000000;">
Q(publishaddr__contains=<span style="color: #800000;">'<span style="color: #800000;">山西<span style="color: #800000;">'<span style="color: #000000;">)
).values(<span style="color: #800000;">'<span style="color: #800000;">title<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #0000ff;">print<span style="color: #000000;">(book)
<span style="color: #0000ff;">return HttpResponse(<span style="color: #800000;">'<span style="color: #800000;">OK<span style="color: #800000;">')
注意:Q查询条件和非Q查询条件混合使用注意,不包Q()的查询条件一点要放在Q(查询条件)后面
