python-django框架-orm相关继续&ORM的增删改查操作_20191110

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)

相关推荐