字段类型

不同的字段类型,同步到数据库中就是不同的数据类型,且能通过新增或编辑时,可通过clean_fields()自查

  • BooleanField —代表True(1) 或者 False (0)

    • 参数有default
    • 数据库中存的是1 和0

  • IntegerField --整形 对应mysql 为int
  • BigIntField — 长的数字,如电话号码那么长
  • DecimalField —类似python中的浮点型
  • AutoField –自增
    如果没有指定主键primary_key=True,django会自动写一个如下,所以自己也可以重新命名一个自增idid = models.AutoField(max_length=191, primary_key=True)
    

  • CharField

    在mysql中对应是 varchar,所以要指定长度
    name= models.CharField(max_length=200)
    
  • TextField– 和上类似,比如的文件,考虑存在其他地方,这里存路径,如图片常存的是url
  • EmailField
    在数据库里也是varchar,同时,django还提供了对email的校验和约束
    

  • DateField
  • DateTimeField —常用
    • auto_now_add
    • auto_now
      create_time = models.DateTimeField(auto_now_add=True)
      表示创建时,会更新这个时间
      update_time = models.DateTimeField(auto_now=True)
      表示更新时,会更新这个时间
      

字段约束/选项

除了以上已经介绍的primary_key ,时间类型的 auto_now_add 和 auto_now,还有

  • null

    默认为False, 如果为True, 当前字段可以为NULL. ,python中可以写字段=None
    
  • blank
     代表空白字符`""`, 默认为False,  如果是True, 允许不传,会默认存 空字符串
    
  • unique
      默认为False, 如果为True, 重复记录会报错
    
  • default
  • db_column
    用来定义该字段在数据库里的字段名如
    student_id = models.AutoField(primary_key=True, db_column="id"),在数据库里的字段不是sudent_id
    

命令的调试

如在同步数据库(生成迁移文件,执行迁移时),报错,但又不知道具体原因
python manage.py makemigrations
python manage.py migrate
  • 修改manage.py进行debug调试;先打印下参数是什么,然后写成固定的参数,然后再manage.py中debug方式运行

    print(sys.argv)
    # sys.argv = ['manage.py', 'migrate']
    execute_from_command_line(sys.argv)
    

修复migrations

  • 更改migrations中的文件解决问题;

    • 执行python manage.py migrate命令其实是按顺序执行未同步的migrations.

      如:案例中第一个迁移文件中是('name', models.CharField(max_length=200)),生成了第二个正确的迁移文件中是('name', models.CharField(max_length=191)),但迁移时,执行第一个文件时仍然报错,所以还是要直接改迁移文件,而不是生成迁移文件
      
  • 直接删除migrations文件推倒重来
    • django会在数据表django_migrations中创建同步记录
    • 删除对应的同步记录
    • 如果有创建表的记录, 需要删除表

内嵌类Meta

通过一个内嵌类Meta来定义元数据, 元数据又被称为中介数据, 用于描述数据得数据.

简单地讲, Meta就是通过属性来描述model对象, 为其提供额外得功能.

  • abstract

    将当前模型类转换成抽象类, 当进行migrate的时候会被忽略.

    因为migrate是对实体表进行修改, 而抽象是一个虚的概念, 所以不存在实体.
    如下:同步数据库时,不会生成这个表

    class Person(models.Model):name = models.CharField(max_length=191)email = models.EmailField()update_time = models.DateTimeField(auto_now=True)create_time = models.DateTimeField(auto_now_add=True)null_test = models.CharField(max_length=200, null=True)blank_test = models.CharField(max_length=200, blank=True)class Meta:abstract = True
    
  • app_label

    指定当前model从属于哪个已经注册的应用

    使用场景一般为应用只编写视图层来处理业务逻辑. 模型层统一由一个models模块来管理, 所以要区分所属应用

  • db_table

    自定义表名, 如果不指定表名则默认为应用名_模型名

  • managed

    默认为True, 如果为False, 当前migrate会忽略该模型.

    • 虽然设置了managed为False, 但是如果没有主键的化, 依然会自动创建主键.

    很多公司都会由专人DBA来管理数据库.

    独立开发流程: 创建模型-> migrate

    公司合作开发流程: dba建表->创建模型

  • ordering

    设置排序字段, 默认排序规则为升序

    • -表示降序

      ordering = ['-order_date']
      ordering = ['-pub_date', 'author']
      
    • ?表示随机的意思

      ordering = ['?']
      
  • get_lastest_by

    设置获取最后一条记录的排序规则

    如 指定为get_latest_by 如get_latest_by=[“id”]
    在orm操作中,reader.objects.latest() 获取的最后一个,就是id的最后一个

  • indexes

    设置索引

        class Meta:indexes = [models.Index(fields=['last_name', 'first_name']),models.Index(fields=['first_name'], name='first_name_idx'),]
    
  • unique_together

    多字段唯一性约束

    unique_together = ("driver", "restaurant")
    

模型继承

一个模型可以继承于另外两个模型,要注意,如果两个父模型有冲突字段,建议直接子模型中重新定义一个

class BorrowRecord(Student, Book):pass

一些实例方法

  • 自定义输出实例,可以定义 __str__方法

        def __str__(self):return f"id:{self.id}, {self.question_text}"
    
  • 刷新当前记录.refresh_from_db()

    refresh_from_db
    
  • 字段自验证.clean_fields()新增或者更新时用

    比如EmailField调用clean_fields会验证当前格式是否正确

    如果某个字段不自检,就这么写reader.clean_fields(exclude=['字段名1'])
    
  • 字段唯一性验证.validate_unique(),新增或更新时用,比如字段有

    1.可以所有单个字段,如一个字段有unique=True, 新增或编辑时重复了,就会提示already exists但其实即使不校验也能新增成功
    2. 还能校验组合唯一性(其实是用在这个地方)# 在meta中设置唯一性字段unique_together = ['name', 'email']    #表示不能有 name 和email 都一样的如果新增的都一样了,加上下面这句话,就会保存不成功了(感觉不要exclude排除参数也行)reader.validate_unique(exclude=['null_test', 'create_time', 'update_time', 'id'])
    

django.setup() 初始化一个django环境,便于orm操作练习

原始的是在控制台中console中输入python manage.py shell ,然后再执行orm操作
现在可以这么写,我是新建一个test文件夹,然后新建一个py文件,名字随便写

import os
import random
import djangoif __name__ == "__main__":# 设置环境变量os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")   # mysite表示项目名字django.setup()from myblog.models import Readerprint(Reader.objects.all())
  • 除了把命令写在main中,也可以在上面封装函数,然后main里面调用
  • debug运行时的知识点扩展
    • 还可以通过debug的方式运行,然后在控制台console中里面也能运行命令如.objects.all()

    • 右键选择evaluate express 也能进行执行,或者输入一个变量

django自带的单元测试 TestCase

  1. 在每个应用下有一个自带的tests,新建一个类继续TestCase(继承了uinttest的)
  2. 方法命名时,要已test开头
  3. 运行
    • python manage.py test
    • python manage.py test sign # 指定应用
    • python manage.py test sign.tests.*** # 指定应用下的test.py文件 的 类名为** 的
  4. 效果:不会在数据库里操作
from django.test import TestCase
from myblog.models import Reader# Create your tests here.class ReaderTest(TestCase):def setUp(self) -> None:Reader.objects.create(name="猪", email="taoke@qq.com")def test_create_reader(self):Reader.objects.create(name="狗", email="taoke@qq.com")

QuerySet—CRUD

  • Create 和update ,都是用save()
reader = Reader(name='值',email=f'值',int_test=5)
reader.save()
  • Create方式2或者使用 模型名称.objects.create(**kws)
 Reader.objects.create(name="haha",email="taoke@qq.com")
  • Retrieve(查询)

    Django的orm时一条执行链, 而不是单个语句

    Reader.objects.all().filter(id__gt=300).order_by("name", "id")
    

    orm尽量使用一些简单的接口

    如果查询需求比较复杂, 尽量使用SQL

    • all()—获取的是QuerySet 列表

      获取表中所有记录

      如果表非常大, 一定要小心使用.

    • get()

      通过指定条件, 获取一条数据, 如果有多条, 则会报错

      Reader.objects.get(name="name_99")   或者  pk=1   查询的是唯一不会报错,
      
      reader = Reader.objects.get(name="name_0")     # 查询的不是唯一会报错
      
    • filter()—获取的是querySet 列表

      匹配满足条件的记录, 类似于SQL中的WHERE语句

      reader_array = Reader.objects.filter(name="name_0")
      
      • 比较

        Reader.objects.filter(id__gte=300)
        
        • >= ----- gte
        • > --------gt
        • <=-------lte
        • < --------lt
      • 模糊匹配

        类似于WHERE 字段 LIKE '%xx%'

        • __startswith
        • __endswith
        • __icontains
    • exlude

      filter逻辑取反

    • 限制返回的记录数

      相当于SQL中的limit

      reader_array[:5]  但是查询逻辑不是limit那样只会查到前面,
      
    • latest()

      # 需要在models, Meta中指定get_latest_by 如get_latest_by=["id"],如果不指定,调方法时会报错
      Reader.objects.latest()
      
    • order_by 排序

      Reader.objects.all().order_by("name", "id")
      
  • Update

    • save

      reader.email = "test@163.com"
      reader.save()
      
  • Delete

    如果想对整张表进行清除, 还是truncate table命令更快

    • delete

      reader.delete()
      

高级

  • RAW

    遇到复杂的场景, 需要使用SQL语句

    通过Reader._meta.db_table来获取记录所在表

    queryset = Reader.objects.raw(f"select * from {Reader._meta.db_table} limit 1")
    list(queryset)
    
  • 指定数据库

    • 在settings配置该数据库,

      DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'polls','USER': 'root','PASSWORD': 'qwe369','HOST': '127.0.0.1','PORT': '3306'},'person': {'ENGINE': 'django.db.backends.mysql','NAME': 'person','USER': 'root','PASSWORD': 'qwe369','HOST': '127.0.0.1','PORT': '3306'}
      }
      
    • 使用参数using

      新增或更新时:reader.save(using='person')
      
      查询时:Reader.objects.using('person').all()
      
  • 事务

    • 基于HTTP请求的事务

      • settings中要设置ATOMIC_REQUESTSTrue
      from django.db import transaction@transaction.atomic
      def my_view(request):表达式...
      
    • 基于视图具体逻辑的事务

      from django.db import transactiondef viewfunc(request):表达式with transaction.atomic():表达式A表达式B...
      

django入门操作3相关推荐

  1. Django入门(二) 理解Django生命流程周期

    接上篇:Django入门-项目创建与初识子应用 项目的数据库模型 这里我们先使用sqlite类型的数据库,后面在进行改变 创建数据库模型 名词: ORM(Object Ralational Mappi ...

  2. 【Django入门】——模型管理器对象、模型管理器类和模型类

    文章目录 一.模型管理器对象 1. 自定义模型管理器对象 2. 自定义模型管理器类 3. 自定义模型管理器类应用 3.1 重写框架的方法 3.2 封装自定义方法 4. 模型管理器对象的`model`属 ...

  3. 第一章:Django入门篇

    文章目录 第一章:Django入门篇 一. web应用 二.HTTP协议(重要) 请求协议 响应协议 响应状态码 URL简介 三.django简介 3.2 目录介绍 3.3 启动项目 3.4 简单示例 ...

  4. (译)一个完整的Django入门指南---第7部分

    1.前言 本篇文章是翻译 A Complete Beginner's Guide to Django 系列的最后一篇文章 A Complete Beginner's Guide to Django - ...

  5. 【Django入门】——查询集QuerySet介绍

    文章目录 1. 懒惰查询 2. 查询缓存 3. 查询切片 4. 判断有无 在文章[Django入门]--通过模型类查询MySQL数据库基本操作中,我们知道函数all().filter().exclud ...

  6. 2021年大数据HBase(十):Apache Phoenix的基本入门操作

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Apache Phoenix的基本入门操作 一.Pho ...

  7. Django ORM操作

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果<2> get(**kwargs): 返回与所给筛选条 ...

  8. v2视频服务器退出系统怎么启动,V2视频会议系统入门操作手册.doc

    V2视频会议系统入门操作手册 登陆方式 打开IE(浏览器),用户访问服务器地址00,进入V2 Conference系统主界面. 首次登录视频会议服务器,系统会自动提示客户端下载安装客户端插件,用户也可 ...

  9. Django 入门项目案例开发(上)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. Django 入门案例开发(中) http://www.cnblogs.com/focusBI ...

最新文章

  1. 【C++】【一】结构体数组
  2. 如何用Python实现超级玛丽的界面和状态机?
  3. c#里有遍历目录及子目录以树的形式展现
  4. 视觉SLAM笔记(42) 光流法跟踪特征点
  5. HDU2159 FATE(二维背包、带限制条件的背包问题)
  6. python 修改列名_请教一个 Python 技巧(批量对 pandas.DataFrame()统一修改列名)
  7. 机器人伪装成人类在 GitHub 上为开源项目修复 bug
  8. Nfine框架基本使用--初学者的总结
  9. 使用ACR及MIUI自带通话录音实现通话录音读取及上传
  10. frp内网穿透疑难杂症【1】do http proxy request [host:www.xxx.xxx] error: no root found: www.xxx.xxx
  11. LayoutManager实现翻页动画
  12. PHPExcel设置单元格值下拉选择
  13. VUE打印 每页顶部添加一个二维码
  14. 汉语中的 熟语中的成语900个
  15. 简单粗暴认识jieba(结巴)
  16. 机械中计算机的应用研究,机械设计制造及其自动化中计算机技术的应用研究
  17. Python 网络爬虫:Selenium 好买基金网
  18. php 反射 thinkphp,PHP反射(ReflectionClass、ReflectionMethod)在ThinkPHP框架的控制器调度模块中的应用...
  19. 说说包管理工具 NPM 的基本用法
  20. 关于VMware 虚拟机出现“找不到可以连接的有效对等进程”

热门文章

  1. NVIDIA Jetson AGX Xavier冰壶的跟踪与识别
  2. 详解经历的各个广告联盟平台
  3. JETSON XAVIER NX系统迁移
  4. CSranking(csranking)
  5. Unity 接入百度AI - 人像动漫化
  6. 英雄联盟无限乱斗服务器,英雄联盟:无限乱斗即将来临!国服体验服已上线,你期待吗?...
  7. 一张图带你了解沃创云外呼系统
  8. 360 2018年春招编程题第三题
  9. 测试人员常见的面试题(一)
  10. 认知:大数据-Big Data