So Tired !_! 逆水行舟, 不进则退!

23Aug/11

python datetime 操作相关

Posted by Nick Xu

网上COPY的。里面有问题请自便。

我只是用了一个方法,用来取昨天的日期,并且格式为yyyy-mm-dd
yesterday = (datetime.date.today() + datetime.timedelta(days=-1)).isoformat()

import time
import datetime

# 2007-11-25 15:36:35

#使用datetime模块可以很方便的解决这个问题,举例如下:

d1 = datetime.datetime(2005, 2, 16)
d2 = datetime.datetime(2004, 12, 31)

# 结果:47
print (d1 - d2).days

#上例演示了计算两个日期相差天数的计算。

starttime = datetime.datetime.now()

endtime = datetime.datetime.now()
print (endtime - starttime).seconds

#上例演示了计算运行时间的例子,以秒进行显示。

d1 = datetime.datetime.now()
d3 = d1 + datetime.timedelta(days =10)

print str(d3)
print d3.ctime()

# 上例演示了计算当前时间向后10天的时间。
# 如果是小时 days 换成 hours

# 其本上常用的类有:datetime和timedelta两个。它们之间可以相互加减。
# 每个类都有一些方法和属性可以查看具体的值,如datetime可以查看:天数(day),小时数(hour),星期几(weekday())等;
# timedelta可以查看:天数(days),秒数(seconds) 等。

#
# time , datetime , string 类型互相转换
#
# string -> time
# time.strptime(publishDate,"%Y-%m-%d %H:%M:%S")
#
# time -> string
# time.strftime("%y-%m-%d",t)

date = '2007-01-01'

print type(date)

date = time.strptime(date,"%Y-%m-%d")

print type(date)

print date[0]

d4 = datetime.datetime(date[0], date[1],date[2])

print d4
print type(d4)

#将日期时间对象转成字符串则要用

date = time.strftime("%y-%m-%d",date)
print type(date)

#其中d为日期时间对象

开发需要 搜到了这个程序 因要求前一天的日期 就该了下

根据上面的原理 很容易就可以写出取得前一天日期的程序

d1 = datetime.datetime.now()
d3 = d1 + datetime.timedelta(days = -1)

print datetime.date.today() + datetime.timedelta(days=-1)

print datetime.date.today() - datetime.timedelta(days=1)

Tagged as: No Comments
9Aug/11

django学习笔记——进阶——模型

Posted by Nick Xu

新建应用程序

在开始之前需要新建一个应用程序。在这之前我们已经创建了 project , 那么 project 和 app 之间到底有什么不同呢? 它们的区别就是一个是配置另一个是代码。也就是说一个app是一套Django功能的集合,通常包括模型和视图,按Python的包结构的方式存在。

在“ mysite“ 项目文件下输入下面的命令来创建“ books“ app
python manage.py startapp books
这个命令在mysite目录下新建了一个book的app应用程序

模型

模型创建的流程
1:在settings.py中配置数据库信息
2:在app中models.py文件里定义模型

from django.db import models

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

class Author(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=40)
email = models.EmailField()

class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication_date = models.DateField()

每个模型相当于单个数据库表,每个属性也是这个表中的一个字段

3:模型安装
编辑 settings.py 文件, 找到 INSTALLED_APPS 设置,INSTALLED_APPS 告诉 Django 项目哪些 app 处于激活状态.

INSTALLED_APPS = (
# 'django.contrib.auth',
# 'django.contrib.contenttypes',
# 'django.contrib.sessions',
# 'django.contrib.sites',
'mysite.books',
)

首先,用下面的命令对校验模型的有效性:
python manage.py validate
没问题之后运行下面的命令来生成 CREATE TABLE 语句:
python manage.py sqlall books
然后通过下列命令执行SQL
python manage.py syncdb
syncdb 命令是同步你的模型到数据库的一个简单方法。 它会根据 INSTALLED_APPS 里设置的app来检查数据库, 如果表不存在,它就会创建它。 需要注意的是, syncdb 并 不能 同步模型的修改到数据库。 (本章的最后将详细讨论修改数据库的架构)

基本数据访问

from books.models import Publisher
p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',
city='Berkeley', state_province='CA', country='U.S.A.',
website='http://www.apress.com/')
p1.save()
publisher_list = Publisher.objects.all()

首先,导入Publisher模型类, 通过这个类我们可以与包含 出版社 的数据表进行交互。
接着,创建一个“ Publisher“ 类的实例并设置了字段“ name, address“ 等的值。
调用该对象的 save() 方法,将对象保存到数据库中。 Django 会在后台执行一条 INSERT 语句。
最后,使用“ Publisher.objects“ 属性从数据库取出出版商的信息,这个属性可以认为是包含出版商的记录集。 这个属性有许多方法,这里先介绍调用“ Publisher.objects.all()“ 方法获取数据库中“ Publisher“ 类的所有对象。这个操作的幕后,Django执行了一条SQL “ SELECT“ 语句。

注意:当你使用Django modle API创建对象时Django并未将对象保存至数据库内,除非你调用“ save()“ 方法
如果需要一步完成对象的创建与存储至数据库,就使用“ objects.create()“ 方法

p1 = Publisher.objects.create(name='Apress',
address='2855 Telegraph Avenue',
city='Berkeley', state_province='CA', country='U.S.A.',
website='http://www.apress.com/')

查询数据
Publisher.objects.all() 查询出表的所有数据
数据过滤
Publisher.objects.filter(name=’Apress’) 查询出name为apress值的记录
Publisher.objects.filter(country=”U.S.A.”, state_province=”CA”)
包含性查找
Publisher.objects.filter(name__contains=”press”) 查找出name中包含press的记录。在 name 和 contains 之间有双下划线。其他的一些查找类型有: icontains (大小写无关的 LIKE ), startswith 和 endswith , 还有 range
获取耽搁数据
Publisher.objects.get(name=”Apress”) 如果结果是多个对象,会导致抛出异常:如果查询没有返回结果也会抛出异常

排序

Publisher.objects.order_by(“state_province”, “address”)
逆向排序
Publisher.objects.order_by(“-name”)
连锁
Publisher.objects.filter(country=”U.S.A.”).order_by(“-name”)

限制返回数量
Publisher.objects.order_by(‘name’)[0] 返回第一个
相当于
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
LIMIT 1;
取出特定子集
Publisher.objects.order_by(‘name’)[0:2]
类似于
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
ORDER BY name
LIMIT 0,2;

更新数据
更新单个字段
Publisher.objects.filter(id=52).update(name=’Apress Publishing’)
类似于
UPDATE books_publisher
SET name = ‘Apress Publishing’
WHERE id = 52;

更新多个字段
p = Publisher.objects.get(name=’Apress’)
p.name = ‘Apress Publishing’
p.save()
类似于
SELECT id, name, address, city, state_province, country, website
FROM books_publisher
WHERE name = ‘Apress’;

UPDATE books_publisher SET
name = ‘Apress Publishing’,
address = ‘2855 Telegraph Ave.’,
city = ‘Berkeley’,
state_province = ‘CA’,
country = ‘U.S.A.’,
website = ‘http://www.apress.com’
WHERE id = 52;
在这个例子里我们可以看到Django的save()方法更新了不仅仅是name列的值,还有更新了所有的列。 若name以外的列有可能会被其他的进程所改动的情况下,只更改name列显然是更加明智的

删除数据
p = Publisher.objects.get(name=”O’Reilly”)
p.delete()
删除多条记录
Publisher.objects.filter(country=’USA’).delete()

指定模型的缺省排序方式

class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

def __unicode__(self):
return self.name

class Meta:
ordering = ['name']

class Meta,内嵌于 Publisher 这个类的定义中(如果 class Publisher 是顶格的,那么 class Meta 在它之下要缩进4个空格--按 Python 的传统 )。你可以在任意一个 模型 类中使用 Meta 类,来设置一些与特定模型相关的选项

Tagged as: , No Comments
30Jul/11

Django数据库模型的字段类型总结

Posted by Nick Xu

从网上找了好长时间,总算是找了个差不多。因为经常用,自己又记不住,所以还是总结一下。帮助自己的同时也能帮助别人:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
V=models.CharField(max_length=None[, **options])    #varchar
V=models.EmailField([max_length=75, **options])    #varchar
V=models.URLField([verify_exists=True, max_length=200, **options])    #varchar
V=models.FileField(upload_to=None[, max_length=100, **options])    #varchar
#upload_to指定保存目录可带格式,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])    #varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar
V=models.SlugField([max_length=50, **options])    #varchar,标签,内含索引
V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varchar
V=models.IntegerField([**options])    #int
V=models.PositiveIntegerField([**options])    #int 正整数
V=models.SmallIntegerField([**options])    #smallint
V=models.PositiveSmallIntegerField([**options])    #smallint 正整数
V=models.AutoField(**options)    #int;在Django代码内是自增
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimal
V=models.FloatField([**options])    #real
V=models.BooleanField(**options)    #boolean或bit
V=models.NullBooleanField([**options])    #bit字段上可以设置上null值
V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date
#auto_now最后修改记录的日期;auto_now_add添加记录的日期
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])    #time
V=models.TextField([**options])    #text
V=models.XMLField(schema_path=None[, **options])    #text
——————————————————————————–
V=models.ForeignKey(othermodel[, **options])    #外键,关联其它模型,创建关联索引
V=models.ManyToManyField(othermodel[, **options])    #多对多,关联其它模型,创建关联表
V=models.OneToOneField(othermodel[, parent_link=False, **options])    #一对一,字段关联表属性
Tagged as: , No Comments
26Jul/11

django简单的入门例子

Posted by Nick Xu

建立项目:django-admin.py startproject test1

建立目录:django-admin.py startapp views

django-admin.py startapp db

django-admin.py startapp templates

hello.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.http import HttpResponse
from django.template import Context,Template
from django.template.loader import get_template
from django.shortcuts import render_to_response
 
import datetime
def current_time(request):
    now=datetime.datetime.now()
    html="It is now %s ." %now
    return HttpResponse(html)
 
def hours_ahead(request,offset):
    offset=int(offset)
    dt=datetime.datetime.now()+datetime.timedelta(hours=offset)
    html="In %s hour(s) ,it will be %s." %(offset,dt);
    return HttpResponse(html)
 
def hours_after(request,offset):
    offset=int(offset)
    dt=datetime.datetime.now()-datetime.timedelta(hours=offset)
    html="%s hour(s) ago,it will be %s." %(offset,dt);
    return HttpResponse(html)
 
# plus_or_minus和offset参数由urls.py中设置,这里的设置是
#(r'^now/(plus|minus)(\d{1,2})hours/$', hello.hours_offset),
#与位置顺序有关
def hours_offset(request,plus_or_minus,offset):
    offset=int(offset)
    if plus_or_minus=='plus':
        dt=datetime.datetime.now()+datetime.timedelta(hours=offset)
        html="In %s hour(s) ,it will be %s." %(offset,dt);
    else:
         dt=datetime.datetime.now()-datetime.timedelta(hours=offset)
         html="%s hour(s) ago,it will be %s." %(offset,dt)
    return HttpResponse(html)
 
#使用模板
def t_current_time(request):
    now=datetime.datetime.now()
    html="It is now {{current_time}}."
    t=Template(html)
    c=Context({'current_time':now})
    ret=t.render(c)
    return HttpResponse(ret)
 
#使用模板,需要在setting.py文件里配置TEMPLATE_DIRS , 在这里的地址是'f:/django/test1/templates',
def tl_current_time(request):
    now=datetime.datetime.now()
    t=get_template('current_time.html')
    c=Context({'current_time':now})
    ret=t.render(c)
    return HttpResponse(ret)
 
#使用render_to_response()方法渲染模板
def render_current_time(request):
    now=datetime.datetime.now()
    return render_to_response('current_time.html',{'current_time':now})
 
def renderl_current_time(request):
    current_time=datetime.datetime.now()
    #locals()返回一个包含当前作用域里面的所有变量和他们的值的字典
    #在这里就相当于{'current_time':current_time}
    return render_to_response('current_time.html',locals())
 
#前台循环
def musician_list(request):
    MUSICIANS = [
        {'name': 'Django Reinhardt', 'genre': 'jazz'},
        {'name': 'Jimi Hendrix',     'genre': 'rock'},
        {'name': 'Louis Armstrong',  'genre': 'jazz'},
        {'name': 'Pete Townsend',    'genre': 'rock'},
        {'name': 'Yanni',            'genre': 'new age'},
        {'name': 'Ella Fitzgerald',  'genre': 'jazz'},
        {'name': 'Wesley Willis',    'genre': 'casio'},
        {'name': 'John Lennon',      'genre': 'rock'},
        {'name': 'Bono',             'genre': 'rock'},
        {'name': 'Garth Brooks',     'genre': 'country'},
        {'name': 'Duke Ellington',   'genre': 'jazz'},
        {'name': 'William Shatner',  'genre': 'spoken word'},
        {'name': 'Madonna',          'genre': 'pop'},
    ]
    return render_to_response('musician_list.html',{'musicians':MUSICIANS})

urls.py

这里开通了django的后台管理的功能,1.0版本与0.96版本不太一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from django.conf.urls.defaults import *
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
#from test1.views.hello import current_time
from test1.views import hello
from test1.views import test_form
from test1.views import login
 
urlpatterns = patterns('',
    # Example:
    # (r'^test1/', include('test1.foo.urls')),
    #(r'^index/', include('test1.test.index')),
    (r'^now/$', hello.current_time),
    #(r'^now/plus(\d{1,2})hours/$', hello.hours_ahead),
    #(r'^now/minus(\d{1,2})hours/$', hello.hours_after),
    (r'^now/(plus|minus)(\d{1,2})hours/$', hello.hours_offset),
    (r'^tnow/$', hello.t_current_time),
    (r'^tlnow/$', hello.tl_current_time),
    (r'^rnow/$', hello.render_current_time),
    (r'^rlnow/$', hello.renderl_current_time),
    (r'^list/$', hello.musician_list),
    (r'^forms/$', test_form.search),
    (r'^login/$', login.login),
 
    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
 
    # Uncomment the next line to enable the admin:
    (r'^admin/(.*)', admin.site.root),
)

数据库的简单操作:

这里与0.96似乎有很大的差别,

0.96的版本是class Admin: pass 这样加入admin的管理后台去

而1.0之后的版本则是通过admin.site.register(User) 这个语句是把User表加入到admin的管理后台去

另外也有变化,则需要参考文档,还没有使用那部分的功能

这是models.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from django.db import models
from django.contrib import admin
 
# Create your models here.
 
class User(models.Model):
    id = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=150, blank=True)
    password = models.CharField(max_length=150, blank=True)
 
class TUser(models.Model):
    username = models.CharField(max_length=150, blank=True)
    password = models.CharField(max_length=150, blank=True)
 
admin.site.register(User)
admin.site.register(TUser)

应用:test_form.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.db.models import query
from django.db.models import Q
from django.shortcuts import render_to_response
from test1.db.models import TUser
 
def search(request):
    queryStr=request.GET.get('q','')
    #print request.GET.get('q','')
    #查询所有的对象
    #all=TUser.objects.all()
    #查询指定的对象
    #all=TUser.objects.filter(username='test')
    #查询大于test2的对象
    #all=TUser.objects.filter(username__gte='test2')
    #startswith 相当于WHERE username LIKE 'test%'
    #all=TUser.objects.filter(username__startswith='test').filter(password='test')
    #Q对象 |表示or &表示and
    qset=(Q(username='test6')&Q(password='test6'))
    all=TUser.objects.filter(qset)
 
    #if queryStr=='':
    #    all=TUser.objects.all()
    #else:
    #    all=TUser.objects.filter(username=queryStr)
 
    #print all
    #results = User.objects
    #if request.method=='POST':
    #    print 1
    #else:
    #    print 2
    return render_to_response('formtest.html',{'all':all,'queryStr':queryStr})

templates:formtest.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en"> <head>
<title>Search{% if query %} Results{% endif %}</title>
</head> <body>
<h1>Search</h1>
<form action="." method="GET">
<label for="q">Search: </label>
<input type="text" name="q" value="{{ queryStr|escape }}">
<input type="submit" value="Search">
</form>
<ul>
    {% for a in all %}
<li>{{a.username}}-------------{{a.password}}</li>  
{% endfor %}
 
</ul>
 
</body>
</html>

用户登录例子:login.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python
#-*-coding:utf-8-*-
from django.http import HttpResponse
from test1.db.models import TUser
from django.shortcuts import render_to_response
 
def login(request):
    username=request.GET.get('username','')
    password=request.GET.get('password','')
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute("SELECT count(*) FROM db_tuser WHERE username = %s group by id", [username])
    row = cursor.fetchone()
    print row
 
    return testsss(username,password)
   #if request.session.get('username')==username:
   #     return HttpResponse(username+' is login')
   # flag=checkLogin(username,password)
   # if flag==1:
   #     request.session['username']=username
   #     return HttpResponse('login success!')
   # else:
   #     return HttpResponse('login error')
    #return render_to_response('login.html',{'username':username,'info':''})
 
def testsss(username,password):
    flag=checkLogin(username,password)
    if flag==1:
        return HttpResponse('login success!')
    else:
        return HttpResponse('login error')
 
def checkLogin(username,password):
    try:
        m=TUser.objects.get(username=username)
        if password==m.password:
            #print 'login success'
            return 1
        else:
            #print 'password is error'
            return 2
    except:
        #print 'username is error'
        return 3

页面:login.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{% extends "base.html" %}
{% block title %}login{% endblock %}  
 
{% block content %}
<form action="." method="GET">
<label for="q">login: </label>
<div>用户名:<input type="text" name="username" value="{{ username|escape }}" /></div>
<div>密码:<input type="password" name="password" value="" /></div>
<div><input type="submit" value="login"></div>
</form>
 
<p>
    {% for a in info   %}
    <div>username:{{a.username|escape}}------------password:{{a.password|escape}}</div>    
    {% endfor %}
</p>
 
{% endblock %}

base.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">  
<html lang="en">  
<head>  
    <title>{% block title %}{% endblock %}</title>  
</head>  
<body>  
    <h1>My helpful timestamp site</h1>  
    {% block content %}{% endblock %}  
    {% block footer %}  
    <hr>  
    <p>Thanks for visiting my site.</p>  
    {% endblock %}  
</body>  
</html>

django 框架, 模板在templates中 ,样式和图片在site_media,

templates/index.html

文件内容:

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
 
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<link href="/site_media/admin/css/manager.css" rel="stylesheet" type="text/css" media="screen" />
 
<link href="/site_media/admin/css/manager.css" rel="stylesheet" type="text/css" media="screen" />

没有没什么方法可以在templates中的文件只用写 <link href="css/manager.css" rel="stylesheet" type="text/css" media="screen" />

这样美工做完页面后只用拿过来加入数据就可以了,而不用在改样式图片的路径。

在url.py中

1
2
3
4
import os
site_media = os.path.join(
os.path.dirname(__file__),'site_media/admin/css/'
)

然后

1
2
3
urlpatterns = patterns('',
(r'^css/(?P<path>.*)$','django.views.static.serve',
{ 'document_root': site_media }),

就可以了。

Filed under: Django No Comments
   
site
site