Django是基于Python的Web开发框架,开源。是一个重量级框架,提供了众多的功能组件,让开发更简便快速。
MVC:
model:模型层,负责数据库的建模以及CRUD的操作;
views:视图层,用于处理用户显示的内容,生成页面展示的html内容;
controller:处理业务逻辑,与Model和View交互,返回结果;
MTV:
model:模型层,负责数据库的建模以及CRUD的操作;
views:相当于MVC中的controller层;
template:相当于MVC中的views层;
安装:pip install django
创建Django项目:django-admin startproject 项目名
启动服务:python manage.py runserver
创建应用:python manage.py startapp 应用名称
数据库同步:python manage.py makemigrations,python manage.py migrate
创建超级管理员:python manage.py createsuperuser
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
外层mysite:项目名;内层mysite:项目主目录,包含该项目的所有文件,可当做一个包;
manage.py:命令行工具,管理Django的交互脚本。如启动服务、创建管理员、创建应用、数据库的同步操作等;
__init__.py:定义包的文件;
urls.py:项目的基础url配置文件,可以做路由的分配;
wsgi.py:应用服务器配置文件,提供底层的网络通信功能;
settings.py:项目的主配置文件
BASE_DIR:获取当前项目的根目录路径;
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DEBUG :调试模式
ALLOWED_HOSTS:设置允许访问本项目的地址列表,如果不设置只有本机可以访问。"*",表示任何地址都允许访问该项目(局域网);
ALLOWED_HOSTS = []
INSTALLED_APPS:指定已安装的应用,如果有自定义应用的话,需要在此位置进行注册;
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
MIDDLEWARE:指定注册的中间件;
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF:指定项目的基础路由配置文件;
ROOT_URLCONF = 'mysite.urls'
TEMPLATES:指定模板的信息;
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DATABASES:指定数据库的信息;
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
LANGUAGE_CODE:指定网站的显示语言,如果要使用中文则可以修改为 zh-Hans;
LANGUAGE_CODE = 'en-us'
TIME_ZONE:指定时区,如果指定中国时区,则可以修改为 Asia/Shanghai;
TIME_ZONE = 'UTC'
STATIC_URL:静态文件路径;
STATIC_URL = '/static/'
默认是在主目录中,主路由配置文件,会包含最基本的地址映射。每个请求到达之后,都会由urls.py中的urlpatterns 列表中的url()进行匹配,url()函数匹配上之后,可能将请求转交给其他的urls.py 或 视图(Views)去处理。
def url(regex, view, kwargs=None, name=None):
if isinstance(view, (list, tuple)):
# For include(...) processing.
urlconf_module, app_name, namespace = view
return RegexURLResolver(regex, urlconf_module, kwargs, app_name=app_name, namespace=namespace)
elif callable(view):
return RegexURLPattern(regex, view, kwargs, name)
else:
raise TypeError('view must be a callable or a list/tuple in the case of include().')
python manage.py startapp polls
创建完应用需要在INSTALLED_APPS中注册,
INSTALLED_APPS = [..., 'polls']
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
migrations:存放数据库中间文件(日志文件);
admin.py:应用的后台管理配置文件;
apps.py:应用的属性配置文件;
models.py:模型文件,做ORM映射,数据库处理;
tests.py:测试模块;
views.py:定义视图的文件;
1.、增加操作
1、Entry.objects.create(属性=值,属性=值) (Entry:具体要操作的Model类)
Author.objects.create(name='zhangsan', age=85)
2、创建一个 Models 对象,通过对象的 save() 完成增加
obj = Author(names='laoshe', age=65)
obj.save()
3、使用字典构建对象,通过 save() 完成增加
dic = {
'属性1': '值1',
'属性2': '值2'
}
obj = Entry(**dic)
obj.save()
2、查询操作
1、查询一条数据:get(条件),用法:Entry.objects.get(查询条件/表达式),该函数只适用于 返回一条记录时使用;
2、查询所有数据:all(),用法: Entry.objects.all();
3、查询指定列:values('col1', 'col2', ...),用法:Entry.objects.values('col1', 'col2', ...) 或 Entry.objects.all().values('col1', 'col2', ...);
4、排序函数:order_by('col1', 'col2', ...),用法:Entry.objects.order_byy('col1', '-col2', ...),默认的排序规则是升序,降序,则在列前添加一个 "-";
5、对条件取反:exclude(),用法:Entry.objects.exclude(条件),如:Author.objects.exclude(id=3) 等同于select * from author where not (id=3);
6、根据条件查询部分行数据:filter(参数),用法:Entry.objects.filter(参数)
使用 Entry 中的属性作为查询参数:如 Author.objects.filter(id=1,name='莫言') 等同于 select * from author where id=1 and name='莫言';
也可以使用查询表达式作为查询参数:如 等值判断: Entry.objects.filter(属性__exact=值),例:Author.objects.filter(id__exact=1);
__exact:精确查询,等值判断
__contains:筛选出属性中包含指定关键字的记录(模糊查询)
__lt、__lte、__gt、__gte:筛选出属性值小于、小于等于、大于、大于等于指定值的记录
__startswith、__endswith:筛选出以指定关键字开始、结尾的记录
3、更新数据
1、修改单个数据:通过 get() 得到要修改的实体对象,对实体对象的属性修改属性值,再通过实体对象的save()保存回数据库;
au = Author.objects.get(id=1)
au.names = "老舍"
au.age = 45
au.save()
2、批量修改数据:调用查询结果集的 update() 完成批量修改,先查询出要修改的数据,再更新;
Author.objects.all().update(age=75, sex='male')
或者
Author.objects.filter(id=1).update(age=75, sex='male')
4、删除数据
调用实体对象/查询结果集的 delete()
如:删除单个对象,
obj = Author.objects.get(id=1)
obj.delete()
5、F()和Q()操作
F():在执行操作中,获取某列的值时使用
from django.db.models import F
Author.objecs.all().update(age = F('age') + 10)
Q():在查询条件中,可以完成或(or)的操作,语法:Q(表达式) | Q(表达式)
如:Author.objects.filter(Q(id=6)|Q(age__gte=70)) 查询Author实体中,id为6或年龄大于等于70的人的信息
6、原生数据库操作
查询:raw(sql语句)
增删改:execute(sql语句)
1、一对一
语法:
在关联的两个类的任何一个类中 增加:属性 = models.OneToOneField(Entry)
例:
class Wife(models.Model):
...
author=models.OneToOneField(Author)
查询:
正向查询:通过wife 找 author
1、获取 id 为1 的 Wife的信息:wife = Wife.objects.get(id=1)
2、通过 Wife 的关联属性 author 来找Author:author = wife.author
反向查询:通过author 找 wife
1、获取 id 为14 的 Author的信息:author=Author.objects.get(id=14)
2、通过 author 的关联属性 wife 来找wife: wife = author.wife
wife 是Django通过OneToOneField在Author中默认增加的一个隐式属性
2、一对多
语法:在"多"的实体中,增加: 属性 = models.ForeignKey(Entry)
例:Book(多) 和 Publisher(一)
class Book(models.Model):
... ...
publisher = models.ForeignKey(Publisher)
查询:
正向查询 - 通过Book查询Publisher
#查询id为1的书籍的信息: book = Book.objects.get(id=1)
#查询关联的publisher: publisher = book.publisher
反向查询 - 通过Publisher查询Book
Django会在 1 的实体中增加 关联对象_set 属性,用于查询 多 的数据
结合 Publisher 和 Book 之间关系 :
在 Publisher 中 增加了一个 book_set 属性
例:
publisher = Publisher.objects.get(id=1)
books = publisher.book_set.all()
3、多对多
语法:允许在任何一个实体中增加操作: 属性 = models.ManyToManyField(Entry)
例:
class Author(models.Model):
... ...
book = models.ManyToManyField(Book)
查询:
正向查询-通过Author查询所有的Book
author = Author.objects.get(id=1)
books = author.book.all()
通过 关联属性.all() 查询所有对应数据
反向查询-通过Book查询所有的Author
Django中 会在Book 实体中增加一个隐式属性 author_set
book = Book.objects.get(id=1)
authors = book.author_set.all()
1、db_table:指定该实体类对应到的表的名称
2、verbose_name:定义当前实体类在后台管理的列表页中的名称(单数形式)
3、verbose_name_plural:效果同上,是复数形式
4、ordering:指定实体数据列表页中的排序规则,取值是一个列表,默认按升序排序,降序则需要手动添加 负号