1. 配置文件
1.1 数据库配置
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'dbname', # 数据库名称 'USER': 'root', # 访问数据库用户 'PASSWORD': 'xxx', # 访问数据密码 'HOST': '', # 数据库主机,留空默认为localhost 'PORT': '', # 数据库端口 } } # 由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替 # 如下设置放置的与project同名的配置的 __init__.py文件中 import pymysql pymysql.install_as_MySQLdb()
1.2 模版
TEMPLATE_DIRS = ( os.path.join(BASE_DIR,'templates'), )
1.3 静态文件
STATICFILES_DIRS = ( os.path.join(BASE_DIR,'static'), )
1.4 通过logging配置
通过配置logging,可以查看ORM翻译成的sql语句;把下面内容放到settings.py的任何位置即可
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
2. 自定义标签和过滤器
2.1 自定义标签
1.在app中创建templatetags模块,模块名只能是templatetags;
2. 创建任意 .py 文件,如:my_tags.py
#!/usr/bin/env python #coding:utf-8 from django import template from django.utils.safestring import mark_safe register = template.Library() # register名字是固定的,不可改变 @register.simple_tag # 自定义标签 def my_simple_time(v1,v2,v3): return v1 + v2 + v3 @register.simple_tag def my_input(id,arg): result = "<input type='text' id='%s' class='%s' />" %(id,arg,) return mark_safe(result)
3. 在使用自定义simple_tag的html文件中导入之前创建的 my_tags.py 文件名
{% load my_tags %}
4. 使用simple_tag
{% my_simple_time 1 2 3%} {% my_input 'id_username' 'hide'%}
5. 在settings中配置当前app,不然django无法找到自定义的simple_tag
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', )
2.2 自定义过滤器
1.在app中创建templatetags模块,模块名只能是templatetags;
2. 创建任意 .py 文件,如:my_tags.py
#!/usr/bin/env python #coding:utf-8 from django import template from django.utils.safestring import mark_safe register = template.Library() # register名字是固定的,不可改变 @register.filter # 自定义过滤器 def filter_muli(v1,v2): return v1 * v2
3. 在使用自定义simple_tag的html文件中导入之前创建的 my_tags.py 文件名
{% load my_tags %}
4. 使用simple_tag
{{ num|filter_multi:2 }} {{ num|filter_multi:"[22,333,4444]" }}
5. 在settings中配置当前app,不然django无法找到自定义的simple_tag
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', )
2.3 区别与联系
1.自定义filter只能接收两个参数
2.自定义simple_tag可以接收多个参数
3.自定义filter可以与if使用
4.自定义simple_tag不可与if使用
{% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %} 注意:filter可以用在if等语句后,simple_tag不可以 {% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %}
3. 模板继承 (extend)
模板继承是Django模板中最强大最复杂的。模板继承只是创建一个基本“骨架”,包含站点中的全部元素,并且可以被支模板覆盖blocks。
例如:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="style.css" /> <title>{% block title %}My amazing site{%/span> endblock %}</title> </head> <body> <div id="sidebar"> {% block sidebar %} <ul> <li><a href="/">Home</a></li> <li><a href="/blog/">Blog</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
这个模版,我们称作base.html, 它定义了一个可以用于两列排版页面的简单HTML骨架。“子模版”的工作是用它们的内容填充空的blocks。
子模板
{% extends "base.html" %} {% block title %}My amazing blog{% endblock %} {% block content %} {% for entry in blog_entries %} <h2>{{ entry.title }}</h2> <p>{{ entry.body }}</p> {% endfor %} {% endblock %}
4. 查询api
4.1 api简介
1.all(): 查询所有结果
eg:book_list=models.Book.objects.all() # 返回QuerySet [obj1,obj2...]
2.filter(**kwargs): 筛选条件相匹配的对象
eg:book_list=models.Book.objects.filter(price=134) # 返回QuerySet [obj1,obj2...]
3.get(**kwargs): 筛选条件相匹配的对象,返回结果有且只有一个,
符合筛选条件的对象超过一个或者没有都会抛出错误。
eg:book_list=models.Book.objects.get(id=1) # 返回model对象,返回结果有且只有一个
4.exclude(**kwargs): 筛选出不符合条件的QuerySet对象
5.values(*field): 返回一个特殊的QuerySet,运行后得到一个可迭代的字典序列
eg:book_list=models.Book.objects.all().values("title","price")
6.values_list(*field): 它与values()非常相似,它返回的是一个元组序列
eg:book_list=models.Book.objects.all().values_list("title","price")
7.order_by(*field): 对查询结果排序
eg:book_list=models.Book.objects.all().order_by("price")
book_list=models.Book.objects.all().order_by("-price")
8.reverse(): 对查询结果反向排序
9.distinct(): 从返回结果中剔除重复纪录
10.count(): 返回数据库中匹配查询(QuerySet)的对象数量。
11.first(): 返回第一条记录
12.last(): 返回最后一条记录
13.exists(): 如果QuerySet包含数据,就返回True,否则返回False
4.2 双下划线查询
# 大于,小于 models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 models.Tb1.objects.filter(id__gte=1) # 获取id大于等于1的值 models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 models.Tb1.objects.filter(id__lte=10) # 获取id小于10的值 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains models.Tb1.objects.exclude(name__icontains="ven") # range models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # 其他类似 startswith,istartswith, endswith, iendswith, # order by models.Tb1.objects.filter(name='seven').order_by('id') # asc models.Tb1.objects.filter(name='seven').order_by('-id') # desc # group by from django.db.models import Count, Min, Max, Sum models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
5. 添加
5.1 单表添加
方式1
publish_obj=models.Publish(name="人民出版社",city="北京") publish_obj.save() # 将数据保存到数据库
方式2 返回值publish_obj是添加的记录对象
publish_obj=models.Publish.objects.create(name="人民出版社",city="北京")
5.2 一对多添加
方式1:
publish_obj=models.Publish.objects.get(nid=1) models.Book.objects.create(title="金瓶眉",price=665,publish=publish_obj)
方式2:
models.Book.objects.create(title="金瓶眉",price=665,publish_id=1)
5.3 多对多添加
book_obj=models.Book.objects.create(title="追风筝的人",price=69,publish_id=1) author_1=models.Author.objects.create(name="jack",age=23) author_2=models.Author.objects.create(name="tom",age=32) book_obj.authors.add(author_1,author_2) # 将某个特定的model对象添加到 # 被关联对象集合中。 等价于 book_obj.authors.add(*[]) book_obj.authors.create() # 创建并保存一个新对象,然后将这个对象加被关联对象的集合中,然后返回这个新对象。
6. 编辑
author=models.Author.objects.get(id=5) author.name="jack" author.save() models.Publish.objects.filter(id=3).update(name="教育出版社") update()方法对于任何结果集(QuerySet)均有效
这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
7. 删除
删除方法就是delete()。它运行时立即删除对象而不返回任何值。例如:
e.delete()
每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。
例如
Entry.objects.filter(title="北京").delete()
要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。
删除多对多关系表时,可以用如下方法进行删除
book_obj.authors.remove() # 将某个特定的对象从被关联对象集合中去除。 book_obj.authors.remove(*[]) book_obj.authors.clear() # 清空被关联对象集合。