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的数据库引擎即可; 一、Django连接MySQL1、创建数据库 (
create database day70 default character set utf8 collate utf8_general_ci;
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、无需连表查询性能低,省硬盘空间(选项不固定时用外键) 其他字段
ManyToManyField(RelatedField) 字段参数介绍1.数据库级别生效 - int自增列,必须填入参数 primary_key=
BigAutoField(AutoField)
</span>- bigint自增列,必须填入参数 primary_key=<span style="color: #000000;">True
注:当model中如果没有自增列,则自动会创建一个列名为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;"> 自动创建一个列名为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;"> 自定义自增列</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;">
自定义无符号整数字段
</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: 返回值为字段在数据库中的属性,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,开启刺功能,需要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中提供验证支持 字母、数字、下划线、连接符(减号)
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中提供读取文件夹下文件的功能
</span>-<span style="color: #000000;"> 参数:
path,文件夹路径
match</span>=<span style="color: #000000;">None,正则匹配
recursive</span>=<span style="color: #000000;">False,递归下面的文件夹
allow_files</span>=<span style="color: #000000;">True,允许文件
allow_folders</span>=<span style="color: #000000;">False,允许文件夹
FileField(Field)
</span>-<span style="color: #000000;"> 字符串,路径保存在数据库,文件上传到指定目录
</span>-<span style="color: #000000;"> 参数:
upload_to </span>= <span style="color: #800000;">""</span><span style="color: #000000;"> 上传文件的保存路径
storage </span>=<span style="color: #000000;"> None 存储组件,默认django.core.files.storage.FileSystemStorage
ImageField(FileField)
</span>-<span style="color: #000000;"> 字符串,路径保存在数据库,文件上传到指定目录
</span>-<span style="color: #000000;"> 参数:
upload_to </span>= <span style="color: #800000;">""</span><span style="color: #000000;"> 上传文件的保存路径
storage </span>=<span style="color: #000000;"> None 存储组件,默认django.core.files.storage.FileSystemStorage
width_field</span>=<span style="color: #000000;">None,上传图片的高度保存的数据库字段名(字符串)
height_field</span>=<span style="color: #000000;">None 上传图片的宽度保存的数据库字段名(字符串)
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;"> 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为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 自定义错误验证(列表类型),从而定制想要的验证规则 三、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;">、表.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=类(属性=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;">)
注意以上获取得是和 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() 添加</span>
<span style="color: #008000;">#</span><span style="color: #008000;">clear() 清空</span>
<span style="color: #008000;">#</span><span style="color: #008000;">remove() 删除某个对象</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>
删 ![]() 改 ![]()
models.Book.objects.filter(id=1).update(price=3
</span><span style="color: #008000;">#</span><span style="color: #008000;">修改方式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;">)
注意对象集合调用values(),正向查询是外键字段__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()也支持__小写表名语法进行连表查询:在publish标查询 出版过《笑傲江湖》的出版社
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)
查询谁(哪位作者)出版过的书价格大于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)
通过外键字段正向连表查询,出版自保定的书籍;
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、基本操作![]()
<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 style="color: #008000;"> models.Tb1.objects.filter(name='seven').delete() # 删除指定条件的数据
<span style="color: #000000;"> 2、进阶操作(了不起的双下划线)利用双下划线将字段和对应的操作连接起来 ![]()
<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(idgte=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(idlte=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 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.filter(namecontains="ven")
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.filter(id__range=[1,2]) # 范围bettwen and
<span style="color: #008000;">#<span style="color: #008000;"> startswith,istartswith,endswith,iendswith,
<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;"> from django.db.models import Count,Min,Max,Sum
<span style="color: #008000;">#<span style="color: #008000;"> models.Tb1.objects.all()[10:20]
<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.filter(pub_date__date=datetime.date(2005,1,1))
<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_date__month=12)
<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_dateweek_day=2)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestamphour=23)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampminute=29)
<span style="color: #008000;">#<span style="color: #008000;"> Event.objects.filter(timestampsecond=31) 3、其他操作![]()
%s"},select_params=(1,))
%s"},),order_by=['-nid'])
<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 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 style="color: #008000;"> from django.db import connection,connections 四、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类型, modle.表名.objects.all() 跨表 正操作 所以表间只要有外键关系就可以一直点下去。。。点到天荒地老 所以可以通过obj.外键.B表的列表跨表操作(注意!!orm连表操作必须选拿单个对象,不像SQL中直接表和表join就可以了) print(obj.cls.title) foreignkey字段在那个表里,那个表里一个"空格"代表那个表的多个(一行) <div class="cnblogs_code"> = 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. 在取得时候跨表 反向连表: 反向操作无非2种方式:
obj = UserGroup.objects.all().first() v = UserGroup.objects.values('id','title') v = UserGroup.objects.values_list('id','title') 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;">#</span><span style="color: #008000;"> 获取和苍井空有染的男孩</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张关系表不用写(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):
正向操作:obj.m.all() ![]() obj = models.Boy.objects.filter(name=22,4*[1
obj.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表关系表可以直接操作,但无法通过字段 查询,我们可以把他们结合起来使用;
<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=
<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;">)
through=<span style="color: #800000;">'<span style="color: #800000;">UserFans<span style="color: #800000;">'<span style="color: #000000;">指定第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(,))
|