django模型层(model)进行建表、查询与删除的基础教程


Posted in Python onNovember 21, 2017

前言

在django的框架设计中采用了mtv模型,即Model,template,viewer

Model相对于传统的三层或者mvc框架来说就相当对数据处理层,它主要负责与数据的交互,在使用django框架设计应用系统时,需要注意的是django默认采用的是orm框架中的codefirst模型,也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来

django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与数据库同步版本的变化,所以在使用django进行开发时不要手工去修改数据库,这样会造成django框架的版本记录不正确,从而无法正确的同步数据模型与数据库的内容

django生成的镜像文件内容如下:

from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('web', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='userinfo',
name='sex',
field=models.BooleanField(default=True),
preserve_default=False,
),
]

以上内容为生的一一个版本的镜像,内容记录了对model所在的app的记录,以及执行的动作,如上面的镜像文件记录为对web的app中的model增加了一个名称为sex的字段,字段类型为Boolean,默认为True。

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

本篇仅带领大家进行简单的建表、查询和删除,下面话不多说了,来一起看看详细的介绍吧。 

一、ORM

映射关系:

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

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

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

二、创建表(建立模型)

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

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

from django.db import models

# Create your models here.

class Book(models.Model):
 nid = models.AutoField(primary_key=True) #AutoField有序整形 IntegerField整形
 title = models.CharField(max_length=32) #CharField字符
 author = models.CharField(max_length=32)
 publishDate = models.DateField() #DateField日期类型
 price = models.DecimalField(max_digits=5, decimal_places=2) #DecimalField浮点型也可以用FloatField

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

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

2)字段常用参数

(1)null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

(1)blank

如果为True,该字段允许不填。默认为False。

要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。

如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

(2)default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用。

(3)primary_key

如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True

(4)unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

(5)choices

由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,而且这个选择框的选项就是choices 中的选项。

这是一个关于 choices 列表的例子:

YEAR_IN_SCHOOL_CHOICES = (
 ('FR', 'Freshman'),
 ('SO', 'Sophomore'),
 ('JR', 'Junior'),
 ('SR', 'Senior'),
 ('GR', 'Graduate'),
)

每个元组中的第一个元素,是存储在数据库中的值;第二个元素是在管理界面或 ModelChoiceField 中用作显示的内容。 在一个给定的 model 类的实例中,想得到某个 choices 字段的显示值,就调用 get_FOO_display 方法(这里的 FOO 就是 choices 字段的名称 )。

例如:

from django.db import models

class Person(models.Model):
 SHIRT_SIZES = (
  ('S', 'Small'),
  ('M', 'Medium'),
  ('L', 'Large'),
 )
 name = models.CharField(max_length=60)
 shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)


>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

2、修改配置文件setting

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

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

DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.sqlite3',
  'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}

重新配置

DATABASES = {

 'default': {
   
  'ENGINE': 'django.db.backends.mysql',

  'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好

  'USER': 'root', #你的数据库用户名

  'PASSWORD': '', #你的数据库密码

  'HOST': '', #你的数据库主机,留空默认为localhost

  'PORT': '3306', #你的数据库端口

 }
}

3、创建表命令

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

老版本:

python manage.py syncdb

Django 1.7.1 及以上的版本需要用以下命令

python manage.py makemigrations
python manage.py migrate

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

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-25 03:30
from __future__ import unicode_literals

from django.db import migrations, models

class Migration(migrations.Migration):

 initial = True

 dependencies = [
 ]

 operations = [
  migrations.CreateModel(
   name='Book',
   fields=[
    ('nid', models.AutoField(primary_key=True, serialize=False)),
    ('title', models.CharField(max_length=32)),
    ('author', models.CharField(max_length=32)),
    ('publishDate', models.DateField()),
    ('price', models.DecimalField(decimal_places=2, max_digits=5)),
   ],
  ),
 ]

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

4)注意:

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

No module named "MySQLdb"

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

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

import pymysql

pymysql.install_as_MySQLdb()

运行后在数据库里查看:

django模型层(model)进行建表、查询与删除的基础教程

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

三、查看表

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

from app01 import models #app01是应用名

def index(request):
 # 从数据库取出所有书籍对象
 bookList=models.Book.objects.all() # [bookObj1,.....]
 return render(request,"index.html",{"bookList":bookList})

查询相关

<1> all():    查询所有结果

<2> filter():    查询所给筛选条件相匹配的对象

2、在template模版中接收

{% for book_obj in bookList %}
 <tr>
  <td>{{ book_obj.nid }}</td>
  <td>{{ book_obj.title }}</td>
  <td>{{ book_obj.author }}</td>
  <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  <td>{{ book_obj.price }}</td>
 </tr>
{% endfor %}

四、删除

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

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

1、template模版

{% for book_obj in bookList %}
 <tr>
  <td>{{ book_obj.nid }}</td>
  <td>{{ book_obj.title }}</td>
  <td>{{ book_obj.author }}</td>
  <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  <td>{{ book_obj.price }}</td>
  <td>
   <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
  </td>
 </tr>
{% endfor %}

2、url 分发

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

3、视图函数view实现删除

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python3编码问题汇总
Sep 06 Python
python中如何使用朴素贝叶斯算法
Apr 06 Python
python正则实现计算器功能
Dec 14 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
python中for循环变量作用域及用法详解
Nov 05 Python
Python sys模块常用方法解析
Feb 20 Python
浅谈Python中的异常和JSON读写数据的实现
Feb 27 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
Mar 24 Python
pandas to_excel 添加颜色操作
Jul 14 Python
python实现最短路径的实例方法
Jul 19 Python
LRUCache的实现原理及利用python实现的方法
Nov 21 #Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 #Python
python中is与双等于号“==”的区别示例详解
Nov 21 #Python
Python使用PIL模块生成随机验证码
Nov 21 #Python
Python3中条件控制、循环与函数的简易教程
Nov 21 #Python
Python3 循环语句(for、while、break、range等)
Nov 20 #Python
Python虚拟环境项目实例
Nov 20 #Python
You might like
PHP+DBM的同学录程序(3)
2006/10/09 PHP
php解决约瑟夫环示例
2014/04/09 PHP
PHP的Yii框架中过滤器相关的使用总结
2016/03/29 PHP
几款极品的javascript压缩混淆工具
2007/05/16 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
react配置antd按需加载的使用
2019/02/11 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
vue中axios防止多次触发终止多次请求的示例代码(防抖)
2020/02/16 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
OpenLayers实现图层切换控件
2020/09/25 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
Python中每次处理一个字符的5种方法
2015/05/21 Python
详解Python中的日志模块logging
2015/06/19 Python
python函数的5种参数详解
2017/02/24 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
python将unicode和str互相转化的实现
2020/05/11 Python
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
eDreams意大利:南欧领先的在线旅行社
2018/11/23 全球购物
大专毕业生简历的自我评价
2013/10/20 职场文书
业务经理岗位职责
2013/11/11 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
学生安全责任书范本
2014/07/24 职场文书
租房安全协议书
2014/08/20 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书
综治维稳工作汇报
2014/10/27 职场文书
2014年房地产个人工作总结
2014/12/20 职场文书
先进学校事迹材料
2014/12/30 职场文书
目标责任书格式范文
2015/05/11 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
现实表现证明材料
2015/06/19 职场文书