zoukankan      html  css  js  c++  java
  • 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() # 清空被关联对象集合。
  • 相关阅读:
    android studio 各种问题
    关于Android开发中Arm、X86和Mips(草稿)
    每日更新
    Error creating bean with name 'userRepository': Invocation of init method failed;
    API 'variant.getJavaCompiler()' is obsolete and has been replaced with 'variant.getJavaCompileProvider()'
    increase the minSdkVersion to 26
    Exception thrown on Scheduler.Worker thread. Add `onError` handling
    M600 Pro 安装问题解决
    Could not parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed.
    大疆无人机M100相关问题解决过程
  • 原文地址:https://www.cnblogs.com/goodshipeng/p/7844303.html
Copyright © 2011-2022 走看看