Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)

models中的常用字段

AutoField(primary_key=True)  主键   (int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。)

CharField(max_length=32)     varchar(32)

IntegerField()       int

BigIntergerField()           bigint

DecimalField()     decimal

EmailField()       varchar(254)

DateField()     date

DateTimeField()  datetime

  auto_now:每次编辑数据的时候都会自动更新该字段时间

  auto_now_add:创建数据的时候自动更新

BooleanField(Field)

  给该字段传布尔值  会对影成   数字0/1

  is_delete

  is_status

  is_vip

TextField(Field)

  -文本类型  存储大段文本

FileField(Field)

  - 字符串,路径保存在数据库,文件上传到指定目录,只存文件路径

    upload_to = ‘指定文件路径‘

    给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径

如何自定义char类型字段

from django.db.models import Field

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

class Movie(models.Model):
    textField = RealCharField(max_length=64)

字段内的关键性参数

  null  null=True  允许字段为空,必须用null

  default  默认参数

  django  1.x默认就是级联更新级联删除  django2.x需要你自己手动指定

    on_delete = models.CASCADE

    db_contraints = True

    # 百度

choice参数

  用户的性别
  学历
  婚否
  在职状态
  客户来源
  当你的数据能够被你列举完全 你就可以考虑使用choices参数

models.py

class Userinfo(models.Model):
    username = models.CharField(max_length=32)
    gender_choices = (
        (1,‘男‘),
        (2,‘女‘),
        (3,‘其他‘),
    )
    gender = models.IntegerField(choices=gender_choices)
    # 该字段还是存数字 并且可以匹配关系之外的数字
    record_choices = ((‘checked‘,‘已签到‘),
                      (‘vacate‘,‘请假‘),
                      (‘noshow‘,‘缺勤‘),
                      (‘leave_early‘,‘早退‘),
                      )
    record = models.CharField(‘上课记录‘,choices=record_choices,default=‘checked‘,max_length=64)

test.py

user_obj = models.Userinfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候   get_xxx_display()
print(user_obj.get_gender_display())
# 针对没有注释信息的数据  get_xxx_display()获取到的还是数字本身
user_obj = models.Userinfo.objects.get(pk=4)
print(user_obj.gender)        # 100
print(user_obj.get_gender_display())    # 100

django自动显示sql命令配置

settings.py文件中加入

LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘handlers‘: {
        ‘console‘:{
            ‘level‘:‘DEBUG‘,
            ‘class‘:‘logging.StreamHandler‘,
        },
    },
    ‘loggers‘: {
        ‘django.db.backends‘: {
            ‘handlers‘: [‘console‘],
            ‘propagate‘: True,
            ‘level‘:‘DEBUG‘,
        },
    }
}

数据库查询优化(面试会问)

only与defer

only作用    括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性    对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据    但是是重新走的数据库查询吧
defer与only相反    括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性    对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了

 # res = models.Book.objects.all()  # django orm查询都是惰性查询
    # print(res)

    # res = models.Book.objects.values(‘title‘)
    # print(res)
    # for r in res:
    #     print(r.title)

    # res = models.Book.objects.only(‘title‘)  # 這些對象内部只有title屬性
    # # print(res)
    # for r in res:
    #     # print(r.title)
    #     print(r.price)    # 内部会重新遍历,寻找价格
    """
    only作用
        括号内传字段 得到的结果是一个列表套数据对象 该对象内只含有括号内指定的字段属性
        对象点该字段属性是不会走数据库的 但是你一旦点了非括号内的字段 也能够拿到数据
        但是是重新走的数据库查询吧
    """

    # res = models.Book.objects.defer(‘title‘)  # defer与only互为反关系
    # for r in res:
    #     print(r.title)
    """
    defer与only相反
        括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性
        对象点该字段属性会重复走数据库 但是你一旦点了非括号内的字段 就不走数据库了
    """

selected_related与prefetch_related

selected_related

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

select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一select_related(外键字段1__外键字段2__外键字段3...)

prefetch_related
prefetch_related内部是子查询 但是给你的感觉是连表操作内部通过子查询将外键管理表中的数据页全部给你封装到对象中之后对象点当前表或者外键关联表中的字段也都不需要走数据库了
优缺点比较
select_related连表操作 好处在于只走一次sql查询    耗时耗在 连接表的操作  10s

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

 # select_related和prefetch_related
    # res = models.Book.objects.get(pk=1)
    # print(res.publish.name)

    # res = models.Book.objects.select_related(‘publish‘)
    # for r in res:
    #     print(r.publish.name)
    #     print(r.publish.addr)
    """
    内部是连表操作 现将关系表全部链接起来 之后再一次性查询出来 封装到对象中
    数据对象之后在获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性

    select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
    select_related(外键字段1__外键字段2__外键字段3...)
    """

    # prefetch_related
    # res = models.Book.objects.prefetch_related(‘publish‘)
    # # print(res)
    #
    # for r in res:
    #     print(r.publish.name)

    """
    prefetch_related内部是子查询 但是给你的感觉是连表操作
    内部通过子查询将外键管理表中的数据页全部给你封装到对象中
    之后对象点当前表或者外键关联表中的字段也都不需要走数据库了
    """
    """
    优缺点比较
    select_related连表操作 好处在于只走一次sql查询
        耗时耗在 连接表的操作  10s

    prefetch_related子查询  走两次sql查询
        耗时耗在 查询次数      1s
    """

django orm如何开启事务操作

事务的四大特性(ACID)

  原子性

  一致性

  隔离性

  持久性

start transaction
rollback
commit

代码:

# 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:controller  控制器(路由分发  urls.py)

本质:MTV本质也是MVC

BMS  图书管理系统

  

原文地址:https://www.cnblogs.com/ludingchao/p/12172611.html

时间: 2024-10-23 03:24:39

Django框架进阶5 models常用字段及参数, choices参数, 自动显示sql命令配置, orm查询优化相关, orm中的事务操作, MTV与MVC模型, 图书管理系统(图书的增删改查)的相关文章

【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查

本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系人 说明:为了方便数据不使用真正的数据库,而是通过内存数据模拟 1.       Web API中包含的方法 Action HTTP method Relative URI GetAllContact GET /api/contact GetContact GET /api/contact /id

MVC ---- EF4.0和EF5.0增删改查的写法区别及执行Sql的方法

EF4.0和EF5.0增删改查的写法区别 public T AddEntity(T entity) { //EF4.0的写法 添加实体 //db.CreateObjectSet<T>().AddObject(entity); //EF5.0的写法 db.Entry<T>(entity).State = EntityState.Added; //下面的写法统一 db.SaveChanges(); return entity; } public bool UpdateEntity(T

EF总结--模型创建和数据的增删改查

EF的创建方式有三种: DataBaseFirst 新建项-ADO.NET实体数据模型-从数据库生成 ModelFirst 新建项-ADO.NET实体数据模型-空模型,在设计器中设计实体和它们之间的关系,之后右击选择从模型生成数据库. CodeFirst 通过写代码的方式,创建实体,上下文,数据库也是通过写代码生成. LinQ To EF进行增删改查 增: //实例化上下文 departmentEntities dbcontext = new departmentEntities(); //添加

3、ASP.NET MVC入门到精通——Entity Framework增删改查

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 这里我接上讲Entity Framework入门.从网上下载Northwind数据库,新建一个控制台程序,然后重新添加一个ado.net实体数据模型. EF中操作数据库的"网关"(操作上下文) DBContext封装 .NET Fra

mysql操作入门基础之对数据库和表的增删改查

一.数据库管理-- 1.登陆数据库 1 mysql -u root -p; -- 2.查看数据库服务器所有数据库 1 SHOW DATABASES; -- 3.创建数据库 CREATE DATABASE MyDATA; -- 4.创建带有设置字符集的数据库 CREATE DATABASE MYDATA DEFAULT CHARACTER SET UTF8; -- 5.删除数据库 DROP DATABASE MYDATA; -- 6.查看默认字符集 SHOW CREATE DATABASE MYD

通过用户模型,对数据库进行增删改查操作(2017.11.15)

增加:db.session.add(user)db.session.commit() 查询:User.query.filter(User.username == 'mis1114').first() 修改:user.password = '111111'db.session.commit() 删除:db.session.delete(user)db.session.commit() from flask import Flask, render_template from flask_sqlal

通过用户模型,对数据库进行增删改查操作。

增加:db.session.add(user)db.session.commit() 查询:User.query.filter(User.username == 'mis1114').first() 修改:user.password = '111111'db.session.commit() 删除:db.session.delete(user)db.session.commit() from flask import Flask,render_template from flask_sqlalc

通过用户模型,对数据库进行增删改查操作

from flask import Flask, render_template from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_k

简单的学生管理系统,实现增删改查

#encoding=utf-8# 操作提醒def tip(): print("==="*10) print("学生管理系统V1.0") print("1.添加学生信息") print("2.删除学生信息") print("3.修改学生信息") print("4.查询学生信息") print("5.遍历学生信息") print("6.退出系统!")