要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查。本篇仅带领大家进行简单的建表、查询和删除,因为model的重要性所以后面几篇都会围绕ORM慢慢深入。

本篇导论:

一、ORM

映射关系:

表名 <-------> 类名

字段 <-------> 属性     

表记录 <------->类实例对象


二、创建表(建立模型)

1、创建表的代码写在项目下的models文件中

1)比如我们创建一个图书表,建立如下:

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. nid = models.AutoField(primary_key=True) #AutoField有序整形 IntegerField整形
  7. title = models.CharField(max_length=32) #CharField字符
  8. author = models.CharField(max_length=32)
  9. publishDate = models.DateField() #DateField日期类型
  10. price = models.DecimalField(max_digits=5, decimal_places=2) #DecimalField浮点型也可以用FloatField

类名就是表名,属性就是字段。继承django提供给我们的用于做转换的models.Model才能将我们写的类转化为数据库

定义好模型之后,你需要告诉Django 使用这些模型。你要做的就是修改配置文件。

2)字段常用参数

  1. (1)null
  2.  
  3. 如果为TrueDjango 将用NULL 来在数据库中存储空值。 默认值是 False.
  4.  
  5. (1)blank
  6.  
  7. 如果为True,该字段允许不填。默认为False
  8. 要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
  9. 如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。
  10.  
  11. (2)default
  12.  
  13. 字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。
  14.  
  15. (3)primary_key
  16.  
  17. 如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
  18. Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
  19. 否则没必要设置任何一个字段的primary_key=True
  20.  
  21. (4)unique
  22.  
  23. 如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的
  24.  
  25. (5)choices
  26. 由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。
  27.  
  28. 这是一个关于 choices 列表的例子:
  29.  
  30. YEAR_IN_SCHOOL_CHOICES = (
  31. ('FR', 'Freshman'),
  32. ('SO', 'Sophomore'),
  33. ('JR', 'Junior'),
  34. ('SR', 'Senior'),
  35. ('GR', 'Graduate'),
  36. )
  37. 每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。例如:
  38.  
  39. from django.db import models
  40.  
  41. class Person(models.Model):
  42. SHIRT_SIZES = (
  43. ('S', 'Small'),
  44. ('M', 'Medium'),
  45. ('L', 'Large'),
  46. )
  47. name = models.CharField(max_length=60)
  48. shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
  49.  
  50. >>> p = Person(name="Fred Flintstone", shirt_size="L")
  51. >>> p.save()
  52. >>> p.shirt_size
  53. 'L'
  54. >>> p.get_shirt_size_display()
  55. 'Large'

2、修改配置文件setting

1)django默认使用的是sqlite3数据库,我们使用的是mysql数据库所以需要修改配置

原先配置(将这些配置注释掉)

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }
  6. }

重新配置

  1. DATABASES = {
  2.  
  3. 'default': {
  4.  
  5. 'ENGINE': 'django.db.backends.mysql',
  6.  
  7. 'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好
  8.  
  9. 'USER': 'root', #你的数据库用户名
  10.  
  11. 'PASSWORD': '', #你的数据库密码
  12.  
  13. 'HOST': '', #你的数据库主机,留空默认为localhost
  14.  
  15. 'PORT': '', #你的数据库端口
  16.  
  17. }
  18. }

3、创建表命令

1)同步更改数据库表或字段

  1. 老版本:
  2. python manage.py syncdb
  3.  
  4. Django 1.7.1 及以上的版本需要用以下命令
  5. python manage.py makemigrations
  6. python manage.py migrate

2)运行python manage.py makemigrations后我们应用下的migrations文件夹里会自动生成一个文件,是将我们写的类进一步转化:

  1. # -*- coding: utf-8 -*-
  2. # Generated by Django 1.11.6 on 2017-10-25 03:30
  3. from __future__ import unicode_literals
  4.  
  5. from django.db import migrations, models
  6.  
  7. class Migration(migrations.Migration):
  8.  
  9. initial = True
  10.  
  11. dependencies = [
  12. ]
  13.  
  14. operations = [
  15. migrations.CreateModel(
  16. name='Book',
  17. fields=[
  18. ('nid', models.AutoField(primary_key=True, serialize=False)),
  19. ('title', models.CharField(max_length=32)),
  20. ('author', models.CharField(max_length=32)),
  21. ('publishDate', models.DateField()),
  22. ('price', models.DecimalField(decimal_places=2, max_digits=5)),
  23. ],
  24. ),
  25. ]

3)运行python manage.py migrate后表就插入到我们的数据库中了

4)注意:

如果我们的python是3.x版本运行上面两条会报错

  1. No module named "MySQLdb"

在3.x走数据库用的是pymysql模块所以我们需要告诉django用pymysql

在应用下的__init__.py文件里添加代码

  1. import pymysql
  2.  
  3. pymysql.install_as_MySQLdb()

运行后在数据库里查看:

会发现django给我们创建了很多表 我们自己创建的Book表会被自动改名为 应用名_book 这样避免了我们在不同的应用中有相同的表,其他的表后面用到时会一一介绍。


三、查看表

1、先在视图函数view中将数据取出来

  1. from app01 import models #app01是应用名
  2.  
  3. def index(request):
  4. # 从数据库取出所有书籍对象
  5. bookList=models.Book.objects.all() # [bookObj1,.....]
  6. return render(request,"index.html",{"bookList":bookList})

查询相关

  1. <1> all(): 查询所有结果
  2. <2> filter(): 查询所给筛选条件相匹配的对象

2、在template模版中接收

  1. {% for book_obj in bookList %}
  2. <tr>
  3. <td>{{ book_obj.nid }}</td>
  4. <td>{{ book_obj.title }}</td>
  5. <td>{{ book_obj.author }}</td>
  6. <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  7. <td>{{ book_obj.price }}</td>
  8. </tr>
  9. {% endfor %}

四、删除

删除方法就是 delete()。它运行时立即删除对象而不返回任何值。

比如我们给表中添加一个删除按钮来实现点击按钮后数据库每条记录的删除

1、template模版

  1. {% for book_obj in bookList %}
  2. <tr>
  3. <td>{{ book_obj.nid }}</td>
  4. <td>{{ book_obj.title }}</td>
  5. <td>{{ book_obj.author }}</td>
  6. <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  7. <td>{{ book_obj.price }}</td>
  8. <td>
  9. <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
  10. </td>
  11. </tr>
  12. {% endfor %}

2、url 分发

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^index/', views.index),
  4. url(r'^del/(\d+)', views.delBook),
  5. ]

3、视图函数view实现删除

  1. def delBook(request,id):
  2. models.Book.objects.filter(nid=id).delete()
  3. return redirect("/index/")

django之模型层(model)--建表、查询、删除基础的更多相关文章

  1. Django模型层:多表查询

    一 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关 ...

  2. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  3. Django的模型层(2)---多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...

  4. 模型层字段-多表查询-神奇的双下划线查询-F,Q查询

    Django ORM中常用的字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. In ...

  5. Django之模型层(多表操作)

    一.创建模型 1,一对多关系 一本书只有一个出版社,一个出版社可以出版多本书,从而书与出版社之间就构成一对多关系,书是‘多’的一方,出版社是‘一’的一方,我们在建立模型的时候,把外键写在‘多’的一方, ...

  6. Django之模型层(单表操作)

    一.ORM简介 MVC和MTV框架中包含一个重要部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库. ORM是‘对象-关系- ...

  7. 64、django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  8. 65、django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  9. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

随机推荐

  1. selenium相关:通过location 和 size 获取元素所在像素位置和尺寸,截取图片ROI

    1.实验 #https://captcha.luosimao.com/demo/ chrome default: location 不滚动,直接返回相对整个html的坐标 {'x': 15.0, 'y ...

  2. Python Pexpect库的简单使用

    Python Pexpect库的使用 简介 最近需要远程操作一个服务器并执行该服务器上的一个python脚本,查到可以使用Pexpect这个库.记录一下. 什么是Pexpect?Pexpect能够产生 ...

  3. linux上如何自动获取ip及连接互联网

    1.讲与虚拟机连接网卡设置为net连接 2.BOOTPROTO=dhcp 3.注释原来的ip 4.最后一句网关注释 5.重启网卡 service network restart

  4. Django Simple Captcha插件

    正文开始 先看官方描述 1.安装 打开控制台,输入如下: pip install django-simple-captcha 2.把APP添加到Django项目进入自己的Django项目,在setti ...

  5. NEO区块链-DAPP开发直通车-第零篇

    什么是DAPP DAPP 是以太坊发明的词汇 Decentralized Application. 目前基于区块链技术开发的应用程序广泛的接受使用了这一名称.   NEL将为开发DAPP提供全面的服务 ...

  6. Django——支付宝支付功能

    前期准备 首先我们需要获得支付宝提供的权限与接口,在蚂蚁开放平台进行相关申请:https://openhome.alipay.com/platform/appDaily.htm?tab=info 申请 ...

  7. C语言实现密码修改

    /* *修改密码 *描述: *1.本来已经存在密码 *2.很多时候需要输入两次密码,对比是否正确,才能确认修改密码正确 *敲代码思路: *1.输入旧的密码判断是否正确 *2.提示输入修改后的密码 *3 ...

  8. 简单的C程序

    1.最简单的C程序 #include<stdio.h> //预编译处理指令 int main() // 定义主函数 { printf("hello world"); } ...

  9. docker 进入容器的mongodb

    docker search mongo docker pull mongo docke run -p 27017:27017 -v $PWD/db:/data/db -d  --name mymong ...

  10. python数据类型内置方法 字符串和列表

    1.字符串 内置方法操作# a = 'qqssf'#1. print(a[-1:]) #按索引取,正向从0开始,反向从-1开始# print(len(a)) #取长度# a = 'qqssf'# 2. ...