LeonZhang0 2019-11-11
python-django框架-orm相关继续
orm不常用字段:
1,BigIntegerField(IntegerField):可以存手机号,也可以使用字符串存储手机号,
- 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
2,BooleanField(Field)
- 布尔值类型
3,DateTimeField(DateField)
- 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
4,时间间隔
DurationField(Field)
- 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
import datetime
now = datetime.datetime.now()
#场景:领了一个7天的优惠券,求截止时间是多少???
#这个时候就用到了时间间隔,、
d= datetime.timedelta(days=7)
print(now+d)
print(now)
----------------------------------------
5,现在orm提供的CharField,都是verchar,如果要改成char类型,orm是不支持的,你需要自己定义,
可以自己自定义一个类,固定长度的char,这个面试的时候可能会问到,
###############################################
字段参数
1,primary_key=True
2,max_length=32
3,to=‘表名’
4,null=False
5,unique=True
6,default=‘默认值’
7,db_index=True,如果db_index=True 则代表着为此字段设置数据库索引。索引建多了也不好,更新的时候会变慢,
8,DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性
配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
配置上auto_now=True,每次更新数据记录的时候会更新该字段。
--------------------------------------------
关系字段
ForeignKey
外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 ‘一对多‘中‘多‘的一方。
to=‘表名’ 设置要关联的表
to_field 设置要关联的字段,
on_delete,删除一张表的时候,其他关联表怎么操作,如果删除一个出版社,是不是把出版社下面的书也删除???这样不好,通常要特殊处理,
models.CASCADE
删除关联数据,与之关联也删除,默认就是这个,太可怕了,
models.DO_NOTHING
删除关联数据,引发错误IntegrityError
models.PROTECT
删除关联数据,引发错误ProtectedError
models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
在公司中,绝对不会使用级联操作,也就是不会使用外键,这种外键多了,表多了,之间的关系会非常复杂,牵一发动全身,
全通过代码来建立约束,不要在数据库层面设置外键,分表的时候非常恶心,
db_constraint
是否在数据库中创建外键约束,默认为True。如果设置成False,就是没有关联,
----------------------------------
元信息:
ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息。主要字段如下:
db_table
ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。
index_together
联合索引。
unique_together
联合唯一索引。
ordering
指定默认按什么字段排序。这是在查询的时候默认按照什么排序,
class Meta:
ordering=(‘create_time‘,) #这是一个元组
只有设置了该属性,我们查询到的结果才可以被reverse()
#########################################################################################
ORM的增删改查操作,
1,加载django项目
if __name__ == ‘__main__‘:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_workspace.settings")
#这一句就是在manage.py环境里面,
import django
django.setup()
from app01 import models
ret =models.Person.objects.all()
print(ret)
2, ret =models.Person.objects.all()
3, ret=models.Person.objects.get(id=1)
4, ret=models.Person.objects.filter(id=1)
ret =models.Person.objects.filter(id__gt=1) #这种写法就是id大于1的,
#filter如果是空,不会报错,是一个空的对象,所以项目中一定要filter,几乎不用get,避免报错!!!!
5,ret =models.Person.objects.exclude(id=1)
#这一句就是把id=1的排除掉,然后把其他的查出来,
6,ret =models.Person.objects.all().values() #这是把所有字段拿出来了,这是一个字典序列,
ret =models.Person.objects.all().values(‘name‘,‘create_time‘) #可以指定字段,
7,ret =models.Person.objects.all().values_list(‘name‘,‘create_time‘) #这是返回的一个元组,
8, ret =models.Person.objects.all().order_by(‘id‘)
9, ret =models.Person.objects.all().order_by(‘id‘).reverse()
#请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。
10, ret =models.Person.objects.all().count()
11, ret =models.Person.objects.all().first()
12, ret =models.Person.objects.all().last()
13, ret =models.Person.objects.filter(id=10).exists() #如果QuerySet包含数据,就返回True,否则返回False
这个比较鸡肋,一般是把查询出来的数据判断一下,不使用这种方式,
-----------------------------------------------------
单表查询---双下划线操作,
1,ret =models.Person.objects.filter(id__gt=1,id__lt=3) #查询大于1,小于3的数据,,
2,ret =models.Person.objects.filter(id__in=[1,3]) #in操作,
3,ret =models.Person.objects.exclude(id__in=[1,3]) #这是排除1,3的数据, not in
4,ret =models.Person.objects.filter(name__contains=‘xiao‘) #模糊查询,
5,ret =models.Person.objects.filter(name__icontains=‘xiao‘) #icontains这是忽略大小写,包含指定值,
6,ret =models.Person.objects.filter(id__range=[1,3]) #相当于between and
7,ret =models.Person.objects.filter(create_time__year=2000) #这是查2000年的,
--------------------------------------------------------------------------------
ForeignKey操作
外键的跨表查询,
首先什么是正向查,什么是反向查,
外键在哪张表,就是正向查,否则就是反向查,
#正向查询
#`对象查找(跨表)
book_obj=models.Book.objects.all().first()
ret=book_obj.publisher
print(ret)
ret=book_obj.publisher.name
print(ret)
#字段查找(跨表)
#双下划线表示跨表,
ret=models.Book.objects.filter(id=3).values("publisher__name")
# 反向查询
publisher_obj=models.Publisher.objects.first()
ret =publisher_obj.book_set.all()
#双下划线查找,
ret=models.Publisher.objects.filter(id=1).values("books__title")
print(ret)