Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用。

1. 新建项目和应用

  1.  
  1. python manage.py startapp TestModel # 新建一个项目
  1. (venv)...> python manage.py migrate # 创建表结构
  2. (venv)...> python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
  3. (venv)...> python manage.py migrate TestModel # 创建表结构
  1. 定义模型(models)->激活模型(setting

HelloWorld/TestModel/models.py: 文件代码:


  1. # models.py
  2. from django.db import models
  3.  
  4. class Test(models.Model):
  5. name = models.CharField(max_length=20)
  1. 文件目录:

  1.  
  1. HelloWorld
  2. |-- HelloWorld
  3. |-- manage.py
  4. ...
  5. |-- TestModel
  6. | |-- __init__.py
  7. | |-- admin.py
  8. | |-- models.py
  9. | |-- tests.py
  10. | `-- views.py

  1. 2. 添加应用
    将我们新建的应用(people)添加到 settings.py 中的 INSTALLED_APPS中,也就是告诉Django有这么一个应用。
  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8.  
  9. 'TestModel',
  10. ]

3. 数据库操作(修改models.py)

接下来我们在 HelloWorld 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

 

  1. HelloWorld/HelloWorld/urls.py: 文件代码:

  1. from django.urls import path
  1. from . import views,testdb
  2.  
  3. urlpatterns = [
  4. path('runoob/', views.runoob),
  5. path('testdb/', testdb.testdb),
  6. ]

4、添加数据

  1. HelloWorld/HelloWorld/testdb.py: 文件代码:
  1.  


  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.http import HttpResponse
  4.  
  5. from TestModel.models import Test
  6.  
  7. # 数据库操作
  8. def testdb(request):
  9. test1 = Test(name='runoob')
  10. test1.save()
  11. return HttpResponse("<p>数据添加成功!</p>")

5、获取数据

HelloWorld/HelloWorld/testdb.py: 文件代码:


  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.http import HttpResponse
  4.  
  5. from TestModel.models import Test
  6.  
  7. # 数据库操作
  8. def testdb(request):
  9. # 初始化
  10. response = ""
  11. response1 = ""
  12.  
  13. # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
  14. list = Test.objects.all()
  15.  
  16. # filter相当于SQL中的WHERE,可设置条件过滤结果
  17. response2 = Test.objects.filter(id=1)
  18.  
  19. # 获取单个对象
  20. response3 = Test.objects.get(id=1)
  21.  
  22. # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
  23. Test.objects.order_by('name')[0:2]
  24.  
  25. #数据排序
  26. Test.objects.order_by("id")
  27.  
  28. # 上面的方法可以连锁使用
  29. Test.objects.filter(name="runoob").order_by("id")
  30.  
  31. # 输出所有数据
  32. for var in list:
  33. response1 += var.name + " "
  34. response = response1
  35. return HttpResponse("<p>" + response + "</p>")

6、更新数据

  1. HelloWorld/HelloWorld/testdb.py: 文件代码:

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.http import HttpResponse
  4.  
  5. from TestModel.models import Test
  6.  
  7. # 数据库操作
  8. def testdb(request):
  9. # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
  10. test1 = Test.objects.get(id=1)
  11. test1.name = 'Google'
  12. test1.save()
  13.  
  14. # 另外一种方式
  15. #Test.objects.filter(id=1).update(name='Google')
  16.  
  17. # 修改所有的列
  18. # Test.objects.all().update(name='Google')
  19.  
  20. return HttpResponse("<p>修改成功</p>")

7、删除数据

  1. HelloWorld/HelloWorld/testdb.py: 文件代码:

  1. # -*- coding: utf-8 -*-
  2.  
  3. from django.http import HttpResponse
  4.  
  5. from TestModel.models import Test
  6.  
  7. # 数据库操作
  8. def testdb(request):
  9. # 删除id=1的数据
  10. test1 = Test.objects.get(id=1)
  11. test1.delete()
  12.  
  13. # 另外一种方式
  14. # Test.objects.filter(id=1).delete()
  15.  
  16. # 删除所有数据
  17. # Test.objects.all().delete()
  18.  
  19. return HttpResponse("<p>删除成功</p>")

新建一个对象的方法有以下几种:

  1. Person.objects.create(name=name,age=age)

  2. p = Person(name="WZ", age=23)

    p.save()

  3. p = Person(name="TWZ")

    p.age = 23

    p.save()

  4. Person.objects.get_or_create(name="WZT", age=23)

    这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.

获取对象有以下方法:

  1. Person.objects.all()

  2. Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存

  3. Person.objects.get(name=name)

    get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter

  4. Person.objects.filter(name="abc")  # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人

  5. Person.objects.filter(name__iexact="abc")  # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件

  6. Person.objects.filter(name__contains="abc")  # 名称中包含 "abc"的人

  7. Person.objects.filter(name__icontains="abc")  #名称中包含 "abc",且abc不区分大小写

  8. Person.objects.filter(name__regex="^abc")  # 正则表达式查询

  9. Person.objects.filter(name__iregex="^abc")  # 正则表达式不区分大小写

    filter是找出满足条件的,当然也有排除符合某条件的

  10. Person.objects.exclude(name__contains="WZ")  # 排除包含 WZ 的Person对象

  11. Person.objects.filter(name__contains="abc").exclude(age=23)  # 找出名称含有abc, 但是排除年龄是23岁的

  1.  

常见报错信息

如果执行以上命令时会出现如下报错信息:

原因是 MySQLclient 目前只支持到 Python3.4,因此如果使用的更高版本的 python,需要修改如下:

通过报错信息的文件路径找到 ...site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的 base.py 文件,把这两行代码注释掉(代码在文件开头部分):

  1. if version < (1, 3, 13):
  2. raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

一般点报错的代码文件路径信息,会自动跳转到报错文件中行数,此时我们在报错的代码行数注释掉。

如果出现以下报错信息:

我们点报错的代码文件路径,跳转到报错文件中行数,此时我们在报错的代码行数之前加上:

  1. query = query.encode()


参考:   自强学堂    、   菜鸟教程侵必删

Django 模型(数据库)-cmd下的操作的更多相关文章

  1. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  2. Django模型层之单表操作

    Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软 ...

  3. day 70 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  4. day 69 Django基础五之django模型层(一)单表操作

    Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现 ...

  5. day 56 Django基础五之django模型层(二)多表操作

    Django基础五之django模型层(二)多表操作   本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 ORM ...

  6. day 55 Django基础五之django模型层(一)单表操作

      Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...

  7. Django模型-数据库操作

    前言 前边记录的URLconf和Django模板全都是介绍页面展示的东西,也就是表现层的内容.由于Python先天具备简单而强大的数据库查询执行方法,Django 非常适合开发数据库驱动网站. 这篇开 ...

  8. django模型——数据库(二)

    模型--数据库(二) 实验简介 模型的一些基本操作,save方法用于把对象写入到数据库,objects是模型的管理器,可以使用它的delete.filter.all.order_by和update等函 ...

  9. CMD下文件操作

    CMD下常用文件操作指令 1.输入盘符 如C: 然后回车,相当于进了C盘(c盘一般进的是桌面目录) 2.输入 cd 目录名 然后回车(目录名是c盘中的一级目录名,也可为c盘中的目录路径).如cd mm ...

随机推荐

  1. 【收藏】关于元数据(Metadata)和元数据管理,这是我的见过最全的解读!

    本文主要从元数据的定义.作用.元数据管理现状.管理标准和元数据管理功能等方面讲述了我对元数据(Metadata)和元数据管理的认知及理解. 元数据管理 一.元数据的定义 按照传统的定义,元数据(Met ...

  2. IIS本地部署局域网可随时访问的项目

    原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web项目的目录(D:\Gi ...

  3. 短链接服务Octopus的实现与源码开放

    前提 半年前(2020-06)左右,疫情触底反弹,公司的业务量不断提升,运营部门为了方便短信.模板消息推送等渠道的投放,提出了一个把长链接压缩为短链接的功能需求.当时为了快速推广,使用了一些比较知名的 ...

  4. 利用 Watermill 实现 Golang CQRS

    CQRS CQRS 的意思是"命令-查询责任隔离".我们分离了命令(写请求)和查询(读请求)之间的责任.写请求和读请求由不同的对象处理. 就是这样.我们可以进一步分割数据存储,使用 ...

  5. sql字段拆分 ,连表子查询获取值

    1.连表子查询获取值 select bas.name,bas.id_card_num,bas.mobil_no,gender,bas.birthday,bas.height,bas.weight,pr ...

  6. springboot日志输出到文件

    今天来谈一谈日志,主要是说一说springboot的日志,因为最近在学习springboot.首先在写代码的时候,要养成记日志的习惯,这点真的很重要,因为之前吃了很多亏.过去我对日志很不在意,该有的日 ...

  7. linux security module机制

    linux security module机制 概要 Hook机制,linux MAC的通用框架,可以使用SElinux, AppArmor,等作为不同安全框架的实现

  8. uni-app 页面跳转的两种方法

    1.navigator  标签 <navigator url="../component/classdetails/classdetails"> <view cl ...

  9. Java反编译反混淆神器 - CFR

    最近有大量jar包需要反编译后使用,但是由于jar包中的类被混淆过了,直接反编译以后的里面所有的变量都是一个名字.所以这里介绍一个反混淆神器:CRF. 不知道是不是官网的链接:http://www.b ...

  10. Linux下Oracle 11G XE 安装笔记

    操作系统 [oracle@RAC02 ~]$ lsb_release -aLSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:cor ...