Django---ORM操作大全

<div id="cnblogs_post_body">

前言

Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架

到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:

  • 创建数据库,设计表结构和字段
  • 使用 MySQLdb 来连接数据库,并编写数据访问层代码
  • 业务逻辑层去调用数据访问层执行数据库操作

ORM是什么?:(在django中,根据代码中的类自动生成数据库的表也叫--code first)

ORM:Object Relational Mapping(关系对象映射)

类名对应------》数据库中的表名

类属性对应---------》数据库里的字段

类实例对应---------》数据库表里的一行数据

obj.id obj.name.....类实例对象的属性

Django orm的优势:

Django的orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可;

一、Django连接MySQL

1、创建数据库 (

create database day70 default character set utf8 collate utf8_general_ci;


2、修改project中的settings.py文件中设置 连接 MySQL数据库(Django默认使用的是sqllite数据库)

DATABASES =: :: : : : 

扩展:查看orm操作执行的原生SQL语句

在project中的settings.py文件增加

LOGGING =: 1::: [:

3、修改project 中的__init__py 文件设置 Django默认连接MySQL的方式

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)

扩展

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

字段

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

models.Book.objects.filter(id=1).update(price=3</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;修改方式2 obj.save() </span> book_obj=models.Book.objects.get(id=1<span style="color: #000000;"&gt;) book_obj.price</span>=5<span style="color: #000000;"&gt; 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;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;publish__name</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;).distinct() </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;exclude 按条件排除。。。</span> <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;distinct()去重,exits()查看数据是否存在? 返回 true 和false</span> a=models.Book.objects.filter(title__icontains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;金</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;). </span><span style="color: #0000ff;"&gt;return</span> HttpResponse(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;OK</span><span style="color: #800000;"&gt;'</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;"&gt;"</span><span style="color: #800000;"&gt;小写表名__字段</span><span style="color: #800000;"&gt;"</span><span style="color: #000000;"&gt;) 注意对象集合调用values(),正向查询是外键字段__XX,而反向是小写表名__YY看起来比较容易混淆; books</span>=models.Publish.objects.filter(name__contains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;湖南</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;book__title</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) authors</span>=models.Book.objects.filter(title__icontains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;我的</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;author__name</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(authors) fifter()也支持__小写表名语法进行连表查询:在publish标查询 出版过《笑傲江湖》的出版社 publishs</span>=models.Publish.objects.filter(book__title=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;笑傲江湖</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(publishs) 查询谁(哪位作者)出版过的书价格大于200元 authors</span>=models.Author.objects.filter(book__price__gt=200).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;name</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(authors) 通过外键字段正向连表查询,出版自保定的书籍; city</span>=models.Book.objects.filter(publish__addr__icontains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;保定</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;title</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;print</span>(city)</pre>

1、基本操作

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj = models.Tb1(c1='xx',c2='oo')</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.save()</span>

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 查</span>
<span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; 删</span>
<span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 改</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; models.Tb1.objects.filter(name='seven').update(gender='0')  # 将指定条件的数据更新,均支持 **kwargs</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj = models.Tb1.objects.get(id=1)</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.c1 = '111'</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; obj.save()                                                 # 修改单条数据</span>

<span style="color: #000000;">
基本操作

2、进阶操作(了不起的双下划线)

利用双下划线将字段和对应的操作连接起来

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 大于,小于</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; in</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(idin=[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;"&gt;#</span><span style="color: #008000;"&gt; isnull</span>
    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; Entry.objects.filter(pub_date__isnull=True)</span>

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; contains</span>
    <span style="color: #008000;"&gt;#

<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(name
icontains="ven") # icontains大小写不敏感
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.exclude(name__icontains="ven")

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; range</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__range=[1,2]) # 范围bettwen and

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 其他类似</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> startswith,istartswith,endswith,iendswith,

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; order by</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; group by</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; limit 、offset</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all()[10:20]

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; regex正则匹配,iregex 不区分大小写</span>
    <span style="color: #008000;"&gt;#

<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(title
iregex=r'^(an?|the) +')

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; date</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; year</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; month</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; day</span>
    <span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; week_day</span>
    <span style="color: #008000;"&gt;#

<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_date
week_day__gte=2)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; hour</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphour=23)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
hour=5)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphourgte=12)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; minute</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminute=29)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
minute=46)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminutegte=29)

    <span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; second</span>
    <span style="color: #008000;"&gt;#

<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecond=31)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(time
second=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;"&gt;#</span><span style="color: #008000;"&gt; F</span>
<span style="color: #008000;"&gt;#

<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;"&gt;#</span><span style="color: #008000;"&gt; Q</span>
<span style="color: #008000;"&gt;#

<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(nid
gt=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;"&gt;#</span><span style="color: #008000;"&gt; 执行原生SQL</span>
<span style="color: #008000;"&gt;#

<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表去查询其他的表这个就是反向操作。

正向连表操作总结:

所谓正、反向连表操作的认定无非是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)     
              

2、 多对多:

1、自己写第3张关系表

ORM多对多查询:

女士表:

男生表:

男女关系表

多对跨表操作

obj=models.Boy.objects.filter(name== row </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; 获取和苍井空有染的男孩</span> obj=models.Girl.objects.filter(nike=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;苍井空</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;).first() user_list</span>=<span style="color: #000000;"&gt;obj.love_set.all() </span><span style="color: #0000ff;"&gt;for</span> row <span style="color: #0000ff;"&gt;in</span><span style="color: #000000;"&gt; user_list: </span><span style="color: #0000ff;"&gt;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;"&gt;) obj.m.remove(</span>2,3<span style="color: #000000;"&gt;) obj.m.remove(</span>*[4<span style="color: #000000;"&gt;,]) obj.m.set([</span>1<span style="color: #000000;"&gt;,]) q </span>=<span style="color: #000000;"&gt; obj.m.all() </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; [Girl对象]</span> <span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(q) obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;方少伟</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;).first() girl_list </span>=<span style="color: #000000;"&gt; obj.m.all() obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;方少伟</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;).first() girl_list </span>=<span style="color: #000000;"&gt; obj.m.all() girl_list </span>= obj.m.filter(nick=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;小鱼</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;) </span><span style="color: #0000ff;"&gt;print</span><span style="color: #000000;"&gt;(girl_list) obj </span>= models.Boy.objects.filter(name=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;方少伟</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;).first() obj.m.clear()</span></pre>

反向操作 :obj.小写的表名_set

3、既自定义第三张关系表 也使用ManyToManyField('Boy')字段

ManyToManyField()字段创建第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;"&gt;'</span><span style="color: #800000;"&gt;粉丝们</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,to</span>=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;UserInfo</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,through</span>=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;UserFans</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;,through_fields</span>=(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;user</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;follower</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;))

</span><span style="color: #0000ff;"&gt;def</span> <span style="color: #800080;"&gt;__str__</span><span style="color: #000000;"&gt;(self):
    </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; 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;"&gt;class</span><span style="color: #000000;"&gt; Meta:
    unique_together </span>=<span style="color: #000000;"&gt; [
        (</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;user</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;follower</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;),]

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;"&gt;class</span><span style="color: #000000;"&gt; Girl(models.Model):
            nick </span>= models.CharField(max_length=32<span style="color: #000000;"&gt;)
            </span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; m = models.ManyToManyField('Boy')</span>

        <span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Love(models.Model):
            b </span>= models.ForeignKey(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Boy</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)
            g </span>= models.ForeignKey(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;Girl</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;)

            </span><span style="color: #0000ff;"&gt;class</span><span style="color: #000000;"&gt; Meta:
                unique_together </span>=<span style="color: #000000;"&gt; [
                    (</span><span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;b</span><span style="color: #800000;"&gt;'</span>,<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;g</span><span style="color: #800000;"&gt;'</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生成的第三张表

五、浅谈ORM查询性能

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;"&gt;#</span><span style="color: #008000;"&gt;参与西游记著作的作者中最老的一位作者</span>
ret=models.Book.objects.filter(title__icontains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;西游记</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;author__age</span><span style="color: #800000;"&gt;'</span>).aggregate(Max(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;author__age</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;))
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;{'author__age__max': 518}</span>

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;查看根哥出过得书中价格最贵一本</span>
ret=models.Author.objects.filter(name__contains=<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;根</span><span style="color: #800000;"&gt;'</span>).values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;book__price</span><span style="color: #800000;"&gt;'</span>).aggregate(Max(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;book__price</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;))
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;{'book__price__max': Decimal('234.000')}</span></pre>

2、annotate(*args,**kwargs) 分组函数

ret=models.Book.objects.values().annotate(Max(
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;查看每本书的作者中最老的    按作者姓名分组 分别求出每组中年龄最大的</span>
ret=models.Book.objects.values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;author__name</span><span style="color: #800000;"&gt;'</span>).annotate(Max(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;author__age</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;))
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; < QuerySet[</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '吴承恩','author__age__max': 518},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '张X','author__age__max': 18},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  { 'author__name': '张X杰','author__age__max': 56},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '方X伟','author__age__max': 26},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '游X兵','author__age__max': 35},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '金庸','author__age__max': 89},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  { 'author__name': 'X涛','author__age__max': 27},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;  {'author__name': '高XX','author__age__max': 26}</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ] ></span>

<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt;查看 每个出版社 出版的最便宜的一本书</span>
ret=models.Book.objects.values(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;publish__name</span><span style="color: #800000;"&gt;'</span>).annotate(Min(<span style="color: #800000;"&gt;'</span><span style="color: #800000;"&gt;price</span><span style="color: #800000;"&gt;'</span><span style="color: #000000;"&gt;))
</span><span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; < QuerySet[</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '北大出版社','price__min': Decimal('67.000')},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '山西出版社','price__min': Decimal('34.000')},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '河北出版社','price__min': Decimal('123.000')},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '浙江出版社','price__min': Decimal('2.000')},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '湖北出版社','price__min': Decimal('124.000')},</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; {'publish__name': '湖南出版社',price__min': Decimal('15.000')}</span>
<span style="color: #008000;"&gt;#</span><span style="color: #008000;"&gt; ] ></span></pre>

七、F查询与Q查询

仅仅靠单一的关键字参数查询已经很难满足查询要求。此时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 book=models.Book.objects.filter(title__icontains=,author__name__contains=).values( 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(author
namecontains
=<span style="color: #800000;">'
<span style="color: #800000;">伟
<span style="color: #800000;">'
<span style="color: #000000;">)
)
&<span style="color: #000000;">
Q(publish
addr__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(查询条件)后面


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


注:所有源代码均实测运行过。所有源代码均已上传CSDN,请有需要的朋友自行下载。
继承APIView和ViewSetMixin;作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet在开发接口中不经常用。
一、Django介绍Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django 是一个开放源代码的 Web 应用框架,由 Python 写成。Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。Django学习线路Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。这个MVT模式并
本文从nginx快速掌握到使用,gunicorn快速掌握到使用,实现小白快速搭建django项目,并对可能出现的报错进行了分析
uniapp微信小程序订阅消息发送服务通知
Django终端打印SQL语句 1 Setting配置: 2 默认python 使用的MysqlDB连接,Python3 支持支持pymysql 所有需要在app里面的__init__加上下面配置:
url: re_path(&#39;authors/$&#39;, views.AuthorView.as_view()), re_path(&#39;book/(?P\d+)/$&#39;, vie
前提 关于html寻找路线: template 如果在各个APP中存在, Django 会优先找全局template 文件下的html文件,如果全局下的template文件没有相关的html Djan
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
from bs4 import BeautifulSoup#kindeditordef kindeditor(request): s = &#39;&#39;&#39; &lt;li&gt;&lt;s
view.py 配置 html 配置
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault(&#39;content_type&#
浏览器有一个很重要的概念——同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况
自动发送 &gt; 依赖jQuery文件 实例--&gt;GET请求: 手动发送 &gt; 依赖浏览器XML对象(也叫原生ajax) Ajax主要就是使用 【XmlHttpRequest】对象来完成请
#下面两种是基于QuerySet查询 也就是说SQL中用的jion连表的方式查询books = models.UserInfo.objects.all() print(type(books)) &gt
// GET请求request.GET // POST请求request.POST // 处理文件上传请求request.FILES // 处理如checkbox等多选 接受列表request.get
return HttpResponse(&quot;OK&quot;) 返回一个字符串 return redirect(&quot;/index/&quot;) 返回URL return render