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

yipeiwu_com5年前Python基础

前言

在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给我们创建了很多表 我们自己创建的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设计】的支持。

相关文章

使用IronPython把Python脚本集成到.NET程序中的教程

从两个优秀的世界各取所需,更高效的复用代码。想想就醉了,.NET和python融合了。“懒惰”的程序员们,还等什么? Jesse Smith为您展示如何两个语言来服务同一个.NET程序。...

Python测试人员需要掌握的知识

a、字符串的定义方法 使用单引号(') 你可以用单引号指示字符串,就如同'Quote me on this'这样。所有的空白,即空格和制表符都照原样保留。 使用双引号(") 在双...

python基础教程之五种数据类型详解

Python 五种数据类型 在学习一门语言的过程中,首先肯定就是要先接触到它所拥有的数据类型,Python拥有五种主要的数据类型,下面介绍一下我对这五种数据类型的理解和想法。 1.数...

PyQt5每天必学之带有标签的复选框

PyQt5每天必学之带有标签的复选框

QCheckBox 是具有两种状态的控件:开和关。它是一个带有标签的复选框。复选框通常用于表示应用程序可以启用或禁用的功能。 #!/usr/bin/python3 # -*- cod...

python psutil库安装教程

python psutil库安装教程

确认本机已安装python环境 查看pip版本 安装psutil 卸载第三方库 总结 以上所述是小编给大家介绍的python psutil库安装教程,希望对大家有所帮助,如果大家...