当前位置 : 主页 > 编程语言 > python >

☆Django☆---orm 字段 数据库查询优化 事务

来源:互联网 收集:自由互联 发布时间:2021-06-25
昨日内容回顾 模型层 单表操作 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
昨日内容回顾
    模型层
        单表操作
            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语句时不会走数据库的
这样设计的好处 在于 减轻数据库的压力

 

 

 

 

 

 

 

 

 

 

 

 

 

 

网友评论