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 相关文章推荐
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python导入时小括号大作用
Jan 10 Python
python+pyqt实现右下角弹出框
Oct 26 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python对象转换为json的方法步骤
Apr 25 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
PyQt5实现简单的计算器
May 30 Python
Python基于os.environ从windows获取环境变量
Jun 09 Python
Python进程池与进程锁之语法学习
Apr 11 Python
Python绘制散点图之可视化神器pyecharts
Jul 07 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 操作excel文件的方法小结
2009/12/31 PHP
基于php实现长连接的方法与注意事项的问题
2013/05/10 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
JavaScript验证图片类型(扩展名)的函数分享
2014/05/05 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python使用剪切板的方法
2017/06/06 Python
Python 12306抢火车票脚本
2018/02/07 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
python excel多行合并的方法
2020/12/09 Python
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
先进班级集体事迹材料
2014/01/30 职场文书
商业活动邀请函
2014/02/04 职场文书
出纳会计岗位职责
2014/03/12 职场文书
在校大学生的职业生涯规划书
2014/03/14 职场文书
药学职务聘任书
2014/03/29 职场文书
市场开发计划书
2014/05/07 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
2015年安全生产责任书
2015/01/30 职场文书
人事专员岗位职责
2015/02/03 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
六一文艺汇演主持词
2015/06/30 职场文书