zoukankan      html  css  js  c++  java
  • ☆Django☆---orm 字段 数据库查询优化 事务

    昨日内容回顾
        模型层
            单表操作
                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语句时不会走数据库的
    这样设计的好处 在于 减轻数据库的压力

     

     

     

     

     

     

  • 相关阅读:
    扩展JSON
    字符串格式化---- String.prototype.format
    HigntChats应用举例--报表
    django Form组件之解决数据无法动态显示之BUG----以博客园添加新随笔页为主
    报错:jquery3.1.1报错Uncaught TypeError: a.indexOf is not a function
    HDU 6166 Senior Pan(多校第九场 二进制分组最短路)
    HDU 6069 Counting Divisors(区间素数筛法)
    hdu 6058 Kanade's sum (计算贡献,思维)
    HDU 6052 To my boyfriend(容斥+单调栈)
    HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场
  • 原文地址:https://www.cnblogs.com/lddragon/p/11570107.html
Copyright © 2011-2022 走看看