day42.模型层(查询优化)

模型层字段及参数

models.AutoField(primary_key=True)
models.CharField(max_length=32)      #varchar(32)
models.IntergeField()				#int()
models.DateField()					#date
models.DateTimeField()				#datetime
	auto_now
    auto_now_add
models.DecimalField()				#float()
models.BooleanField()
	给这个字段传布尔值会自动转换成数字0或1(一般用在状态二选一)
TextField()
	存储大段文本
EmailField()
	存储邮箱格式数据
FileField()
	存储数据路径
'''自定义字段'''
from django.db.models import Field


class MyCharField(Field):
    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):
        return 'char(%s)'%self.max_length

常见参数

max_length
varbose_name
default
null
auto_now
auto_now_add
to
unique
db_index
choices

#choices参数
"""针对某个字段可以列举完全的情况 一般都是使用choices参数"""
class Server(models.Model):
    host = models.CharField(max_length=32)

    status_choices = (
        (1,'在线'),
        (2,'待上线'),
        (3,'宕机'),
        (4,'待上架')
    )
    status = models.IntegerField(choices=status_choices)

    desc_choices = (
        ('哈哈','哈哈哈哈哈哈'),
        ('呵呵','呵呵呵呵呵呵'),
        ('嘿嘿','嘿嘿嘿嘿嘿嘿'),
        ('嘻嘻','嘻嘻嘻嘻嘻嘻'),
    )
    desc = models.CharField(max_length=32,choices=desc_choices)

# 获取对应关系
.get_字段名_display()

补充

1.测试环境
	自己拷贝代码
2.测试环境
	pycharm自带的
    	python console
3.配置文件查看所有orm内部SQL语句
	# 直接拷贝到配置文件中即可
	LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

ORM查询优化

# 惰性查询
	用不到的数据即使写了orm语句也不会执行
1.only与defer
2.select_related与prefech_related


# 1.only与defer

    # res = models.Book.objects.values('title')  # 列表套字典

    # res1 = models.Book.objects.only('title')  # 列表套对象
    # print(res1)
    # for i in res1:
    #     # print(i.title)
    #     print(i.price)
    """
    only括号内写什么字段
        生成的对象就含有对应的属性 在查找该属性的时候不再走数据库查询
        但是一旦查找括号内没有的字段属性 则每次都会走数据库查询

    """
    # res1 = models.Book.objects.defer('title')
    # # print(res1)  # 列表套对象
    # for i in res1:
    #     # print(i.title)
    #     print(i.title)
    """
    defer与only刚好相反
        生成的对象就不含有对应的属性 在查找该属性的时候需要每次走数据库查询
        但是一旦查找括号内没有的字段属性 则不需要走数据库查询
    """
    # res = models.Book.objects.filter(pk=3).first()
    # print(res.publish.title)


    # res = models.Book.objects.select_related('publish')
    # for i in res:
    #     print(i.publish.title)
    """
    select_related相当于连表操作
        先将models后面的表和括号内外键字段关联的表连接起来
        之后一次性把所有的数据封装到数据对象中
    """
    res = models.Book.objects.prefetch_related('publish')
    for i in res:
        print(i.publish.title)
    """
    prefetch_related相当于子查询
        先查询models后面的表的所有的数据
        然后将括号内关联的表的数据全部查询出来
        之后整合到一起
    """
上一篇:cin读取数字时遇到字符的总结——C++ primer plus 代码引起思考, 为什么输入q使得程序结束,


下一篇:Linux学习笔记09 -- 超详细shell脚本编程快速入门