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', }, }, }

浙公网安备 33010602011771号