您的位置:首页 > 其它

web开发——4.一个完整的web项目和子应用程序的创建以及数据模型操作的两种方法

2018-01-08 21:11 661 查看

一、创建一个完整的web项目

1.在pycharm命令行中输入命令:     django-admin   startproject     myweb,即可创建一个新的web项目

新的web项目包含如下文件结构:

各个文件分别有如下作用:

|-- myweb/             # 项目文件夹[根目录]

|-- myweb/              # 根项目(主项目)

     |-- __init__.py          # 模块文件

     |-- urls.py               # 路由文件[url地址和处理函数进行对应]

     |-- settings.py          # 项目的设置配置文件

     |-- wsgi.py               # 实现了wsgi网关协议的模块

|-- manage.py           # 项目的命令管理模块[不需要修改,直接使用]

2.在新的web项目下,使用命令:django-admin    startapp   myblog    为创建的项目创建一个名称为myblog的子应用程序。

该子模块创建之后,整个项目结构如下:

3.myweb为根项目,myblog为子应用程序,两者并列.
(1).在根项目myweb中,创建第一个view视图,views.py文件

在views.py文件中,引入HttpResponse模块,定义一个index函数,在浏览器中访问项目时返回return的数据。

from django.http import HttpResponse

def index(request):

    return HttpResponse(“这个是根项目首页,也可作为门户网站的首页”)

(2).在子应用程序myblog中,创建子应用程序的第一个view视图,默认子应用程序已存在views.py文件。

4.在根项目和子应用程序中都已经创建了各自的视图,用于访问时向页面输出数据,但是怎么区分浏览器访问的是根项目还是子应用程序呢?此时就是路由发挥作用的时候了,一般情况下,在urls.py文件中,根据正则表达式,用于筛选匹配浏览器中url对应的数据,以此来区分要访问的是主路由还是子路由,由此决定向页面展示的是根项目中的视图还是子应用程序的视图。若每个子应用程序或者根项目中的views.py文件中定义了多个函数,也就是说在视图中定义不同的函数,展示不同的页面,要展示哪个页面也是在各自的路由urls.py文件中决定的。

(1).在主路由中,要向匹配主项目也就根项目中的视图,需要先引入视图,然后利用正则表达式,依次匹配views.py文件中不同的函数。

(2)在myblog子应用程序中,新建一个urls.py文件

5.除了在主路由中配置include,在根项目中的settings.py配置文件中的INSTALLED_APPS中将子应用程序名称加入列表。此配置是为了使子应用程序中的数据模型models.py可以由根项目来管理。



6.在浏览器中输入localhost:8000/index即可访问到根项目中的视图,返回对应的数据“这个是根项目的首页,也可作为门户网站的首页”,以此可访问根项目中的登录和子应用程序的视图都可访问到。

二. 程序模型—数据库同步 

1. Django 项目连接 mysql 数据库 
Django 项目要操作数据库,首先要和数据库建立连接,才能让程序中的数据和数据库关联 起来进行数据的增删改查操作 
 
Django项目默认使用mysqldb模块进行和mysql数据库之间的交互操作,但是mysqldb 模块对于 python3.4 以上的版本支持还不够完善,所以我们要使用替代方案 :通过 pymysql 模块完成和数据库之间的交互过程 

Django 连接 mysql 数据库的操作,是通过根模块的配置实现的,在项目根模块的配置文件 settings.py 中,我们可以查询到如下默认配置: 

DATABASES = {    

 'default': {        

 'ENGINE': 'django.db.backends.sqlite3',        

 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),   

  }

 } 

 

DATABASES 配置:用于进行数据库连接信息的配置  ENGINE:用于特定的数据库引擎的配置,一般选项如下 

django.db.backends.sqlite3 

 django.db.backends.postgresql 

 django.db.backends.mysql 

django.db.backends.oracle 

 NAME:要连接的数据库名称的配置 

 USER:配置连接数据库的用户账号 

 PASSWORD:配置连接数据库的登录密码 

HOST:配置数据库所在的主机 IP 地址 

 PORT:配置连接数据库的端口号 

 CHARSET:配置连接数据库交互数据编码格式 
 

配置和 mysql 数据库的连接信息如下:

 # 1.引入需要的模块 

import pymysql

 # 2.转换数据库支持 

pymysql.install_as_MySQLdb() 



 #3.配置DATABASES字典

DATABASES = {     

'default': {        

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

 'NAME': 'py_db',         

'USER': 'root',        

 'PASSWORD': '',  # 配置为空表示无密码        

 'HOST': '',       # 配置为空表示连接的是当前 PC        

 'PORT': '3306'     } } 

 

如此~Django 和数据库之间的连接关系就建立了 

三、子项目中数据模型的增删改查操作

1.将对象的操作封装在类型中 修改模型定义类,创建一个静态的对象创建方法

2.将对象的操作封装在类型中 修改模型定义类,创建一个静态的对象创建方法
 from django.db import models 

 

class Author(models.Models):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=50) 

 

@classmethod def create(cls, name):     
        author = cls(name = name)     
        return author 

 

重新定义 views.py 中的处理函数
 from  django.http import HttpResponse
 from . import models 

 

def create_author(request): 
         author = models.Author.create("tom") author.save()     
        return HttpResponse("save ok! ") 

 

 

 
3.通过使用 Django 提供的对象管理器 Manager,给每个模型类创建一个管理类 如作者类型 Author 的数据管理类为 AuthorManager,这也是符合面向对象开发思想的 一种开发方式,不同的类型负责不同的功能,互相协作完成整个功能 
 
重新定义模型类型如下:
 from django.db import models 

 

class AuthorManager(models.Manager): 

 
def create_author(self, name):    
author = self.create(name = name) 

 

class Author(models.Model): 
id = models.AutoField(primary_key=True) 
name = models.CharField(max_length=50) 
author_manager = AuthorManager() 

 

重新定义视图处理函数如下:
 from django.http import HttpResponse 
from . import models 

 

def create(request):     
author = models.Author.author_manager.create_author("jerry")    
 
return HttpResponse("save ok!") 

 

可以看出来,第二种方式对第一种方式又进行了深层的封装操作 

 

6. 查询操作 

查询数据的操作一般都是数据操作中比较复杂的一部分,针对不同的操作方式进行分类讲解 为了方便进行快速的操作,我们通过 Django 提供的一个 shell 测试命令行进行处理 

 

进入项目文件夹,运行如下命令进入项目测试命令行 python manage.py shell 

 

6.1. 查询多条数据 

 all()查询全部数据  filter([condition])查询指定条件数据,如果没有指定条件,等同于 all()  exclude([condition])查询指定条件之外的数据,如果没有指定条件,等同于 all() 

 

 order_by()根据指定的字段进行排序查询,字段前面添加符号'-'表示倒序  values()将查询到的数据转换成字典,保存在列表中返回 >>> from myblog.models import Author 

 

>>> a = Author.author_manage 

 

>>> a.all() <QuerySet [<Author: 1--tom>, <Author: 2--jerry>]> >>> a.filter(name="tom") <QuerySet [<Author: 1--tom>]> >>> a.exclude(name="tom") <QuerySet [<Author: 2--jerry>]> >>> a.order_by("id") <QuerySet [<Author: 1--tom>, <Author: 2--jerry>]> >>> a.order_by("-id")
<QuerySet [<Author: 2--jerry>, <Author: 1--tom>]> >>> a.values() <QuerySet [{'id': 1, 'name': 'tom'}, {'id': 2, 'name': 'jerry'}]> 

 

6.2. 查询单条数据 

 get([condition])查询指定条件的数据,返回 0条或者多条都会出现异常  count()返回查询到的结果的总数  first()返回查询到的第一条数据  last()返回查询到的最后一条数据  exists()判断查询结果中是否包含数据 >>> a.get(name="tom") <Author: 1--tom> >>> a.count() 2 >>> a.first() <Author: 1--tom> >>> a.last() <Author: 2--jerry> >>> a.exists()
True 

 

6.3. 条件查询 

 相等条件查询  key=value  包含条件查询  key__contains=value:模糊查询 like 

author:大牧莫邪 

 

 开头结尾查询  key__startswith=value   key__endswith=value  是否为空查询  key__isnull=True   key__isnotnull=True  范围查询  key__in=[1,2,3,4,5,6,7]  关系查询  key__gt=1  大于 1   grant than  key__gte=1  大于等于 1  grant than or equals  key__lt=1  小于 1  key__lte=1 小于等于 1  日期查询[year/month/day/week_day/hour/minute/second]
 key__year=2017 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐