热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Django常用字段及参数、事务、数据库查询优化

常用字段注意:Django中没有设置对应char类型的字段,但可以支持自己定义。自定义对应于数据库的char类型字段:fromdjango.db.modelsimp

常用字段

注意:

Django中没有设置对应char类型的字段,但可以支持自己定义。

自定义对应于数据库的char类型字段:

from django.db.models import Field

class RealCharField(Field):
    \'\'\'
    自定义的char类型字段
    \'\'\'
    def __init__(self,max_length,*args,**kwargs):
        self.max_length = max_length #拦截一个父类的方法,操作完之后,利用super调用父类方法
        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

class Movie(models.Model):
    textField = RealCharField(max_length=64)
自定义char字段

常用字段列举

AutoField(primary_key=True)  # int自增列,主键字段

CharField(max_length=32)   # 对应数据库中的varchar字段,必须提供max_length参数, max_length表示字符长度

IntegerField()           int

BigIntegerField()         bigint

DecimalField()          decimal

EmailField()           varchart(254)

DateField()         # 年月日

DateTimeField()       # 年月日时分秒

BooleanField(Field)          # 给该字段传布尔值 会对应成  数字0/1
 
TextField(Field)            # 文本类型

FileField(Field)           # 路径保存在数据库,文件上传到指定目录
     # upload_to = \'指定文件路径\'
     # 给该FileField字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径

常用字段参数

null  # 用于表示某个字段可以为空。

unique  #如果设置为unique=True 则该字段在此表中必须是唯一的 。

db_index  #如果db_index=True 则代表着为此字段设置索引。

default   #为该字段设置默认值。

DateField和DateTimeField字段参数

auto_now_add  #配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

auto_now    #配置上auto_now=True,每次更新数据记录的时候会更新该字段。

外键字段参数

外键类型在ORM中用来表示外键关联关系

to     #设置要关联的表

to_field     #设置要关联的表的字段

Choice参数

如性别,学历,婚否等一些数据能够被你列举完全  你就可以考虑使用choices参数

class Userinfo(models.Model):
    username = models.CharField(max_length=32)
    gender_choices = (
        (1, \'\'),
        (2, \'\'),
        (3, \'其他\'),
    )
    gender = models.IntegerField(choices=gender_choices)
    #该字段还是存数字,还可以存匹配关系之外的数字

数据库查询优化

only()与defer()

only():括号内传字段 得到的结果是一个列表套数据对象,该对象内只含有括号内指定的字段。
对象点该字段属性是不会走数据库查询的,但是你一旦点了非括号内的字段,也能够拿到数据,但是是重新走的数据库查询

    res = models.Book.objects.only(\'title\') #这些对象内部只有title属性
    for r in res:
        print(r.title)     #不走数据库查询
        print(r.price)     #走数据库查询

defer():与only相反,括号内传字段 得到的结果是一个列表套数据对象,该对象内没有括号内指定的字段属性,对象点该字段属性会重复走数据库,但是你一旦点了非括号内的字段,就不走数据库查询了。

    res = models.Book.objects.defer(\'title\')  # defer与only互为反关系
    for r in res:
        print(r.title)     #走数据库查询
        print(r.price)     #不走数据库查询

select_related和prefetch_related

select_related内部是链表操作,会将关系表全部连接起来拼成一个大表,之后一次性查询出来,把所有数据都封装到一个对象中。
数据对象再获取任意表中的数据的时候都不需要再走数据库了,因为全部封装成了对象的属性。

    res = models.Book.objects.select_related(\'publish\')
    for r in res:
        print(r.publish.name)
\'\'\' select_related括号内只能传外键字段,并且不能是多对多字段,只能是一对一和一对多字段 select_related(外键字段1__外键字段2__外键字段3) \'\'\'

prefetch_related内部是子查询,但是给你的感觉是链表操作。

内部通过子查询将外键关联表中的数据也全部给你封装到对象中,之后对象点当前表或外键关联表中的字段也都不需要走数据库了

两者优缺点比较:

select_related链表操作,优势在于只走一次sql查询,耗时耗在连接表的操作

prefetch_related子查询,走两次sql查询,耗时耗在查询次数

Django orm开启事务操作

事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性

事务的四大特性(ACID):
  原子性:事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
  一致性:事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
  隔离性:指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
  持久性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响

# django orm 开启事务操作    
from django.db import transaction
with transaction.atomic():
#在with代码块中执行的orm语句同属于一个事务 pass #代码块运行结束,事务就结束了

MTV与MVC模型

MTV django 号称是MTV框架

M:models
T:templates
V:views

MVC

M:models
V:views
C:contronner 控制器(路由分发 urls.py)

MVC模型是一种使用 Model View Controller( 模型-视图-控制器)设计创建 Web 应用程序的模式。

Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。
    通常模型对象负责在数据库中存取数据。

View(视图):是应用程序中处理数据显示的部分。
    通常视图是依据模型数据创建的。

Controller(控制器):是应用程序中处理用户交互的部分。
    通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MTV模型
FLask用的是MTV的模式
所谓的MTV ( Model–Template–View ),翻译一下就是模型、模板、视图。
一般是用户通过浏览器向我们的服务器发起一个请求(request),
这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。

 

 

 


推荐阅读
  • 原文转自:http:blog.csdn.netchinasoftosgarticledetails7903045UploadAction.java:packagecr ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 动量|收益率_基于MT策略的实战分析
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了基于MT策略的实战分析相关的知识,希望对你有一定的参考价值。基于MT策略的实战分析 ... [详细]
  • fileuploadJS@sectionscripts{<scriptsrc~Contentjsfileuploadvendorjquery.ui.widget.js ... [详细]
  • 用ESP32与Python实现物联网(IoT)火焰检测报警系统
    下图是本案例除硬件连线外的3步导学开发过程,每个步骤中实现的功能请参考图中的说明。在硬件连线完成之后我们建议您先使用“一分钟上云体验”功能预先体验本案例的实际运行效果 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 开发笔记:UEditor调用上传图片上传文件等模块
    1、引入ue相关文件,写好初始代码为了更好的封装整一个单独的插件,这里我们要做到示例化ue后隐藏网页中的编辑窗口,并移除焦点。 ... [详细]
author-avatar
仔田
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有