django-orm

常用字段

 1     AutoField:
 2         自增的整形字段,必填参数primary_key=True,则成为数据库的主键。
 3     CharField:
 4     
 5     IntegerField:
 6         一个整数类型。数值的范围是 -2147483648 ~ 2147483647 7         
 8     DateField:
 9     
10     DateField:
11         auto_now:每次修改数据的时候,时间都会变成当前时间
12         auto_now_add:只有新创建队形的时候才会改变时间
13         
14         参数互斥,不能同时设置
15         
16     BooleanField(Field)
17         - 布尔值类型  保存在数据库中是0|1
18 
19     NullBooleanField(Field):
20         - 可以为空的布尔值     保存在数据库中是NULL|0|1
21         
22     FloatField(Field)
23         - 浮点型
24         
25     DecimalField(Field)
26         - 10进制小数
27         - 参数:
28             max_digits,小数总长度
29             decimal_places,小数位长度

 

自定义字段

 1 自定义字段:相当于Mysql中的char类型
 2     class MyCharField(models.Field):
 3     """
 4     自定义的char类型的字段类
 5     """
 6 
 7     def __init__(self, max_length, *args, **kwargs):
 8         self.max_length = max_length
 9         super().__init__(max_length=max_length, *args, **kwargs)
10 
11     def db_type(self, connection):
12         """
13         限定生成数据库表的字段类型为char,长度为max_length指定的值
14         """
15         return 'char(%s)' % self.max_length

 

Admin创建超级用户

    1.在终端输入python manager.py createsuperuser
        输入的密码必须:不少于8位_由字母_数字组成


    2.注册model
    在app01文件的admin。py下

        from app01 import models

        admin.site.register(models.Person)

    3.登陆admin网址

    4.在settings。py下就显示中文
        LANGUAGE_CODE = 'zh-Hans'

 

字段中参数

	null:是否可以为空,默认为False
	default:默认值
	primary_key:设置主键
	db_column:相当于起别名,在数据库展示的时候显示的字段名
	#db_table:一般为app01_类名小写,设置后改变表名
	db_index:该字段作为索引
	unique:该字段是否可以建立唯一索引
	
	与admin相关:
		blank:设置为Ture后,admin可以输入为空
		verbose_name:设置后admin显示为设置名字
		choices=[(0, '男'),(1, '女'),],default=0:设置后admin为可选项
	
	meta参数:
	 class Meta:
        # 数据库中生成的表名称 默认 app名称 + 下划线 + 类名
        db_table = "person"

        #admin中显示的表名称
        verbose_name = 'admin_person'

        # admin首页中的表名
        verbose_name_plural = '所有用户信息'

        # # 联合索引
        # index_together = [
        #     ("pub_date", "deadline"),  # 应为两个存在的字段
        # ]
        #
        # # 联合唯一索引
        # unique_together = (("driver", "restaurant"),)  # 应为两个存在的字段
	

  

ORM操作必会13条

    all(): 返回表中所有数据--》queryset类型
    get(条件):返回符合条件的对象--》对象         查询不到或多个或报错
    filter(条件):可以返回多个符合条件的Queryset         查询不到为空
    exclues(条件):返回不符合条件的queryset
    order_by(根据哪个字段进行排序):返回Queryset
    Queryset.count():返回查询到的个数
    QUeryset.first():返回查询结果的第一条数据--》返回的是obj
    QUeryset.last():返回查询结果的最后一条数据——》返回的是obj
    Queryset.exists():返回布尔值,有为True,没有False
    Qureyset.values():返回的是一个表的字典
    Queryset.values():返回的是一个query的元组,没有字段
    reverse:倒序
    distinct:对结果去重,比如去重values_lst('name')的重复

    返回QuerySet:
    all()
    filter()
    values()
    values_list()
    distinct()
    reverse()
    order_by()
    exclues()
    返回对象:
    get()
    first()
    last()
    返回数字:
    count()
    返回布尔值:
    exsits()
    

 

单表查询双下方法

单表查询--双下方法:
    在filter方法下

    pk__gt=1:pk>1
    pk_lt=2:pk<2
    pk__in=[1,2,3]:获得id等于1,2,3,的数据
    pk__range=(1,3):相当于between and 1-3的数据

    name__contains='':表示包含''字符的数据
    name__icontains='':表示包含''字符的数据(不区分大小写)

    类似的:startswith,endswith,istartwith,iendswith,带i的不区分大小写
    
    #obj=models.Publisher.objects.filter(name__contains='出')
    

 

外键查询

外键的查询:
    基于对象的查找

      #正向查找
        obj=models.Book.objects.get(pk=1)#筛选出ID为1的book的出版社名称
        print(obj.pub.name)

      # 反向查找
        #找出出版社ID为1出版的书
        pub_obj=models.Publisher.objects.get(pk=1)


        # 外键中不指定related_name
        # 1.pub_obj.关联表名小写_set,得到关系管理对象
        print(pub_obj.book_set.all(),type(pub_obj.book_set))

        # 外间中指定related_name
        # 2.pub_obj.外键的related_name得到关系管理对象
        print(type(pub_obj.books))
        
        
    基于字段的查找
      # 正向查找
        # 查找人民出版社出版的图书
        # 关联字段_字段='值'

        # obj=models.Book.objects.filter(pub__name='人民出版社')
        # print(obj)

      # 反向查找
        #站在Publisher的角度找红楼梦的出版社

        # 指定related_name=books
        # 字段设置为:books__name='红楼梦'
        # obj=models.Publisher.objects.filter(books__name='红楼梦')
        # print(obj)

        # 不指定related_name
        #关联的表名小写__字段
        # ojb=models.Publisher.objects.filter(book__name='红楼梦')
        # print(ojb)
        
    关系管理对象的方法:
        #必须设置related_name
            pub_obj=models.Publisher.objects.get(pk=1)
            #all():查询所有的book对象
            #add():添加已有的关系对象
            #set():表示设置已有关系,没有设置的对象会变
            #remove():移除两者的关系
            #clear():清空关系  移除关系的时候注意设置null=True
            pub_obj.book_set.add(*models.Book.objects.filter(pk=3))
            pub_obj.books.remove(*models.Book.objects.filter(pk=2))
            pub_obj.books.set(models.Book.objects.filter(pk__in=[1,2,3,7]))
            pub_obj.books.clear()

 

多对多

多对多关系查询            
    # 不指定related_name

    # 对象查找
    # 正向查找
    #找吴承恩写的书名字
    # au_obj=models.Author.objects.get(pk=1)
    # print(au_obj.books.values_list('name'))     #au_obj,books得到多对多关系对象
    # 字段查找
    # 找水浒的作者
    # print(models.Author.objects.filter(books__name='水浒')[0].name)

    # 反像查找
    # obj=models.Book.objects.get(pk=1)
    # print(obj.author_set.all())

    # 多对多关系管理对象的方法

        obj=models.Author.objects.get(pk=1)

        # obj.books.add(*models.Book.objects.filter(pk=7))
        # obj.books.remove(*models.Book.objects.filter(pk=7))
        # obj.books.clear()
        # obj.books.set(models.Book.objects.filter(pk__in=[1,2,3,4]))

 

聚合

聚合:返回的是键值对的字典
    from django.db.models import Max,Min,Sum,Avg,Count
    
    
    #求最贵的图书
    model.Book.objects.aggregate(Max('price'))
    
    可以指定键的名字
    model.Book.objects.aggregate(max=Max('price'))
    
    可以传多个聚合函数
    model.Book.objects.aggrecate(Max('price'),Min('price'))

 

分组

分组
    # 根据出版社分组
    # a1=models.Book.objects.values('pub__name').annotate(max=Max('price')).values('pub__name','max')

    # 求每个出版社出版的书的价格平均值
    # a1=models.Publisher.objects.annotate(avg=Avg('books__price')).values('name','avg')
    # 求每个数由几个作者写的并且筛选出作者的个数大于1的
    # a1=models.Book.objects.annotate(count=Count('authors')).filter(count__gt=1).values('name','count')
    # 求每个出版社最便宜的书的价格
    # a1=models.Publisher.objects.annotate(min=Min('books__price')).values('name','min')


    # 每个书的作者总数进行排序
    # a1=models.Book.objects.annotate(count=Count('authors')).order_by('count').values('name','count')


    # 每个作者写的书的总价格
    # a1=models.Author.objects.annotate(sum=Sum('books__price')).values('name','sum')

 

F和Q查询

F和Q查询

    # F查询
    #查询销售数量》库存的书
    # a1=models.Book.objects.filter(sale_num__gt = F('stock_num'))

    # F加减乘除:把其中的字段进行更新
    # obj=models.Book.objects.all().update(sale_num=F('sale_num')*2+1)


    # Q查询:因为filter查询是逗号,是and条件的
    #查询名字为123或者价格为20的书
    obj=models.Book.objects.filter(Q(name='123')|Q(price=50)&Q(pk=1))
    print(obj)

 

事物

事物:
    
    from django.db import transaction
    try:
        with transaction.atomic():
            models.Author.objects.create(name='a')
            models.Author.objects.create(name='a')
            models.Author.objects.create(name='a')
            # int('s')
    except Exception as e:
        print(e)


    # 事物:遇到错误会把之前执行的sql语句删除,回退
    
    

 

posted @ 2019-05-16 19:25  烧刘病  阅读(82)  评论(0编辑  收藏  举报
回到页首