昨日内容回顾 模型层 单表操作 1.增 user_obj = models.User.objects.create() user_obj = models.User() user_obj.save() 2.改 models.User.objects.filter().update() user_obj = models.User.objects.filter().first() user_obj.username = 'jason' user_obj.save() 3.查 models.User.objects.filter() models.User.objects.all() models.User.objects.get() 4.删 models.User.objects.filter().delete() user_obj = models.User.objects.filter().first() user_obj.delete() 13条查询方法 all() filter() get() values() # 列表套字典 values_list() # 列表套元组 first() last() count() exclude() distinct() order_by() exists() reverse() 神奇的双下划綫查询 价格大于 小于 大于等于 小于等于 在什么之间 或好几个选择 price__gt price__lt price__gte price__lte price__in price__range 书籍名称中包含 title__contains='p' title__icontains='p' 创建的年份 create_time__year 多表操作 外键字段的增删改查 一对多 publish_id = 1 publish = publish_obj 多对多 add() set() remove() # 上面三个都支持 传数字或者是对象 并且都可以传多个 # 但是set必须接受一个可迭代对象 clear() # 不需要传参数 直接清空所有关系 跨表查询 规律:只要是queryset对象 就可以无限制的点queryset的方法!!! 正方向概念 正向:关联字段在当前表中 反向:关联字段不再当前表 结论:正向查询按字段,反向查询按表名小写 """ 不要一次性把orm写完,写一点看一点 """ # 基于对象的跨表查询(子查询) # 一次只拿一个对象 然后利用对象点的操作 完成数据的查询 # 正向 book_obj.publish.name book_obj.authors # App01.Author.None book_obj.authors.all() author_obj.author_detail.phone # 反向 """反向表名小写什么时候需要加_set(当获取的是多个对象的饿时候)""" publish_obj.book_set # App01.Book.None publish_obj.book_set.all() author_obj.book_set # App01.Book.None author_obj.book_set.all() author_detail_obj.author.name # 基于双下划綫的跨表查询(连表查询) models.Book.objects.filter().values('publish__name') models.Publish.objects.filter(book__title='三').values('name') models.Book.objects.filter().values('authors__author_detail__phone') # 只要表中有外键字段 你可以通过__无限制的跨表 F与Q F查询 从数据库中获取字段对应的数据 库存数大于卖出数 Q查询 与 filter(Q(),Q()) filter(Q()&Q()) 或 filter(Q()|Q()) 非 filter(~Q()) 补充 q = Q() q.connector = 'or' q.children.append(('title','三')) q.children.append(('price',666)) models.Book.objects.filter(q)
Django ORM 常用字段和参数
常用字段
AutoField
int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。
IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)
CharField(在mysql中是 varchar类型 且django中没有 char字段 需要自己定义)
字符类型,必须提供max_length参数, max_length表示字符长度。
在django中如何定字段? 技巧:大部分设计到数据库的 模块都是 django.db import models(****)
DateField 和 DateTimeField 以及他们的参数
auto_now_add ----添加一次
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
auto_now --- 修改就改
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
字段参数
null 例子: null=Ture
用于表示某个字段可以为空。
unique 例子 unique = True 其他知识点:外键字段的一对一 可以不用Foreignkey直接就是 unique
如果设置为unique=True 则该字段在此表中必须是唯一的 。
db_index
如果db_index=True 则代表着为此字段设置索引。
default
为该字段设置默认值。
其他需要了解的字段
from django.db import models # Create your models here. #Django中没有对应的char类型字段,但是我们可以自己创建 class FixCharField(models.Field): ''' 自定义的char类型的字段类 ''' def __init__(self,max_length,*args,**kwargs): self.max_length=max_length super().__init__(max_length=max_length,*args,**kwargs) def db_type(self, connection): ''' 限定生成的数据库表字段类型char,长度为max_length指定的值 :param connection: :return: ''' return 'char(%s)'%self.max_length #应用上面自定义的char类型 class Class(models.Model): id=models.AutoField(primary_key=True) title=models.CharField(max_length=32) class_name=FixCharField(max_length=16) gender_choice=((1,'男'),(2,'女'),(3,'保密')) gender=models.SmallIntegerField(choices=gender_choice,default=3) 自定义及使用
关系字段以及他的参数
ForeignKey
字段参数
to
设置要关联的表
to_field
设置要关联的表的字段
on_delete
当删除关联表中的数据时,当前表与其关联的行的行为。
models.CASCADE
删除关联数据,与之关联也删除
db_constraint
是否在数据库中创建外键约束,默认为True。
外键字段
当你在使用django2.X版本的时候 在建立外键关系时(*****)
需要你手动添加几个关键点参数
models.cascade
db_constraints
数据库查询优化 only与defer select_releated与prefect_releated
orm内所有的语句操作 都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的
这样设计的好处 在于 减轻数据库的压力