django进阶

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() # 清空被关联对象集合。

 

posted @ 2017-11-16 14:45  平凡执着  阅读(183)  评论(0编辑  收藏  举报