django_学习笔记

qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='WeizhongTu')
 
# 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的
 
# 去重方法
qs = qs.distinct()

 __str__() 函数 对象要怎么表示自己, 一般系统默认使用<Article: Article object> 来表示对象, 通过这个函数可以告诉系统使用title字段来表示这个对象

清空数据    flush 

导入导出:

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

 创建用户:

python manage.py createsuperuser
 
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
 
# 修改 用户密码可以用:
python manage.py changepassword username

 

终端上输入 python manage.py 可以看到详细的列表

服务器运行ip:  runserver x.x.x.x:port  

一、0.0.0.0

参考RFC文档: 
0.0.0.0/8 - Addresses in this block refer to source hosts on “this” 
network. Address 0.0.0.0/32 may be used as a source address(源地址) for this 
host on this network; other addresses within 0.0.0.0/8 may be used to 
refer to specified hosts on this network

根据RFC文档描述,它不只是代表本机,0.0.0.0/8可以表示本网络中的所有主机,0.0.0.0/32可以用作本机的源地址,地址块0.0.0.0/32仅含有一个地址,被保留用于某主机需要发送一个IPv4分组,但不知道自己地址的情况下。通常用于主机正在启动,主机为了获取自己的地址,向引导DHCP服务器发送一个IPv4分组,以全0的地址作为源地址,受限广播地址作为目的地址。

在路由器配置中可用0.0.0.0/0表示默认路由,作用是帮助路由器发送路由表中无法查询的包。当到达了一个知道如何到达目的地址的路由器时,这个路由器就会根据最长前缀匹配来选择有效的路由。子网掩码匹配目的IP地址而且又最长的网络会被选择。用无类别域间路由标记表示的IPv4默认路由是0.0.0.0/0。因为子网掩码是/0,所以它是最短的可能匹配。 当查找不到匹配的路由时,自然而然就会转而使用这条路由。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中去。严格说来,0.0.0.0/0已经不是一个真正意义上的IP地址了。它表示的是这样一个集合:所有未知的主机和目的网络。这里的“未知”是指在本机的路由表里没有特定条目指明如何到达综合起来可以说0.0.0.0/0表示整个网络。它的作用是帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中去。

二、255.255.255.255

限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。如果翻译成人类的语言,应该是这样:“这个房间里的所有人都注意了!”这个地址不能被路由器转发。

三、127.0.0.1

本机地址,主要用于测试。用汉语表示,就是“我自己”。在Windows系统中,这个地址有一个别名“Localhost”。寻址这样一个地址,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为“127.0.0.1”的数据包。

  0.0.0.0 ->在本网络所有机器上运行这个服务,即所有网络的主机都可以访问

url(r'^add/(\d+)/(\d+)/$', calc_views.add, name='add'),
def add(request, a, b):
    c = int(a) + int(b)
    return HttpResponse(str(c))

 参数 a,b 对应url 括号内匹配值,name指定此url

name 的使用:

网页模板中 如下使用,完美处理 参数变化  --绑定处理过程,url更换较为方便

不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
<a href="{% url 'add' 4 5 %}">link</a>
更换url处理
url(r'^add/(\d+)/(\d+)/$', views.old_add_redirect),
处理跳转  旧->新
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def old_add_redirect(request, a, b):
    return HttpResponseRedirect(
        reverse('add', args=(a, b))
    )
重定向到 name=add

 

 

 模板:

django 默模板路径是app下templates 但是为了方便调用其它app的模板文件,会遍历所有的templates文件夹,当文件名重复时候,会出现问题,所以通过添加路径定义唯一的模板文件,让app 成为模板的一部分。->    templas下添加app名字的文件夹,里面放模板文件,然后 通过  app/index.html  访问任意模板

在模板中取字典的键是用点info_dict.site,而不是Python中的 info_dict['site'],效果如下:
{{ info_dict.site }} 内容:{{ info_dict.content }}
遍历字典
{% for key, value in info_dict.items %}
    {{ key }}: {{ value }}
{% endfor %}

if语句  (forloop.last 最后一个)
{% for item in List %}
    {{ item }}{% if not forloop.last %},{% endif %} 
{% endfor %}

for empty 例子
<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% empty %}
    <li>抱歉,列表为空</li>
{% endfor %}
</ul>
as 取别名 用法 {% url 'some-url-name' arg arg2 as the_url %}

views.py 中用的 render 函数(推荐),是 render_to_response 的话,需要将 request 加入到 上下文渲染器

上下文渲染器: 

       context_processors 中放了一系列的 渲染器,上下文渲染器 其实就是函数返回字典,字典的 keys 可以用在模板中,request 就是一个上下文渲染器,主要为了书写灵活,避免代码冗余。

 

setting文件下新建context_processor.py
from django.conf import settings as original_settings
def settings(request):
    return {'settings': original_settings}
def ip_address(request):
    return {'ip_address': request.META['REMOTE_ADDR']}
导入渲染器
1
TEMPLATES = [ 2 { 3 'BACKEND': 'django.template.backends.django.DjangoTemplates', 4 'DIRS': [], 5 'APP_DIRS': True, 6 'OPTIONS': { 7 'context_processors': [ 8 'django.template.context_processors.debug', 9 'django.template.context_processors.request', #request 10 'django.contrib.auth.context_processors.auth', 11 'django.contrib.messages.context_processors.messages', 12 13 'zqxt.context_processor.settings', #自定义渲染器 14 'zqxt.context_processor.ip_address', #自定义渲染器 15 ], 16 }, 17 }, 18 ]

代码应用例子

<h1>Blog Home Page</h1>
 
DEBUG: {{ settings.DEBUG }}
 
ip: {{ ip_address }}     # 获取任意来访ip 程序灵活度提高,类似一个全局的字典。key 代表 value

 数据库:

       get,filter  查单个,列表 ,error,[]   |||查询的字段中不能有 __(双下划线,因为在Django QuerySet API中有特殊含义(用于关系,包含,不区分大小写,以什么开头或结尾,日期的大于小于,正则等)

     objects.get_or_create()   防止重复的有效方法,速度慢

    

 1 Person.objects.all()
 2 Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
 3 Person.objects.get(name=name)
 4 get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
 5 Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
 6 Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
 7 Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
 8 Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
 9 Person.objects.filter(name__regex="^abc") # 正则表达式查询
10 Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
11 filter是找出满足条件的,当然也有排除符合某条件的
12 Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
13 Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

表修改 1.7以后

      python manage.py makemigrations
      python manage.py migrate

自定义 field:

    待了解

QuerysetAPI :

  

es = Entry.objects.all()
for e in es:
    print(e.headline)

 

Entry.objects.all().exists()  检测是否有对象

用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)      #优化

 list(es) 可以强行将 QuerySet 变成 列表

序列化 查询集合

>>> import pickle
>>> query = pickle.loads(s)     # Assuming 's' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query            # Restore the original 'query'.

  链式查询   |||    字段名 负号 倒序 不支持负索引 切片->可以通过reverse函数和负号倒序

Author.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="tuweizhong@163.com")
# 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)

 Person.objects.all()[:10] 切片操作,前10条

Person.objects.all()[-10:] 会报错!!!
# 1. 使用 reverse() 解决
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条
 
# 2. 使用 order_by,在栏目名(column name)前加一个负号
Author.objects.order_by('-id')[:20] # id最大的20条

 

去重

qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='WeizhongTu')
 
# 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的
 
# 去重方法
qs = qs.distinct()

 查看django 执行了哪些SQL :   query

In [1]: print str(Author.objects.all().query)

SELECT "blog_author"."id", "blog_author"."name", "blog_author"."qq", "blog_author"."addr", "blog_author"."email" FROM "blog_author"

简化一下,就是:SELECT id, name, qq, addr, email FROM blog_author;


In [2]: print str(Author.objects.filter(name="WeizhongTu").query)

SELECT "blog_author"."id", "blog_author"."name", "blog_author"."qq", "blog_author"."addr", "blog_author"."email" FROM "blog_author" WHERE "blog_author"."name" = WeizhongTu

  values_list  返回元组

2.1 比如我们要获取作者的 name 和 qq
In [6]: authors = Author.objects.values_list('name', 'qq')
In [7]: authors
Out[7]: <QuerySet [(u'WeizhongTu', u'336643078'), (u'twz915', u'915792575'), (u'wangdachui', u'353506297'), (u'xiaoming', u'004466315')]>
In [8]: list(authors)
Out[8]: 
[(u'WeizhongTu', u'336643078'),
 (u'twz915', u'915792575'),
 (u'wangdachui', u'353506297'),
 (u'xiaoming', u'004466315')]
如果只需要 1 个字段,可以指定 flat=True
In [9]: Author.objects.values_list('name', flat=True)
Out[9]: <QuerySet [u'WeizhongTu', u'twz915', u'wangdachui', u'xiaoming']>
In [10]: list(Author.objects.values_list('name', flat=True))
Out[10]: [u'WeizhongTu', u'twz915', u'wangdachui', u'xiaoming']

values 获取字典

  In [13]: Author.objects.values('name', 'qq')

  Out[13]: <QuerySet [{'qq': u'336643078', 'name': u'WeizhongTu'}, {'qq': u'915792575', 'name': u'twz915'}, {'qq': u'353506297', 'name': u'wangdachui'}, {'qq': u'004466315', 'name  ': u'xiaoming'}]>

  extra 实现别名

  tags = Tag.objects.all().extra(select={'tag_name': 'name'})

  defer   排除不要的字段 only 仅需要某些字段 prefetch_related 一对多,多对多  selected_related 一对一 多对一

   annotate 聚合函数

  In [66]: from django.db.models import Count

 

  In [66]: Article.objects.all().values('author_id').annotate(count=Count('author')).values('author_id', 'count')

 

  Out[66]: <QuerySet [{'count': 20, 'author_id': 1}, {'count': 20, 'author_id': 2}, {'count': 20, 'author_id': 4}]>

 

  setting.py 配置 添加打印实际执行sql语句

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG' if DEBUG else 'INFO',
        },
    },
}

 

 

posted @ 2017-02-17 11:03  pokerstarxy  阅读(191)  评论(0)    收藏  举报