2011年3月9日 星期三

[Python] Django 之資料庫與 Models 使用筆記

用了 Django 一陣子,常常會碰到 Datetime 的問題,乾脆記一下。


建立資料表時,使用到 DateTimeField:


from django.db import models
import datetime

MyDatetime((models.Model):
# 新增資料必要欄位
myid = models.CharField(max_length=255)

# 新增資料必要欄位, 沒有指定 mydate1 數值或其格式不對時會出錯
mydate1 = models.DateTimeField()

# 新增資料非必要,允許 mydate2 為 None 或不設定
mydate2 = models.DateTimeField(null=True, blank=True, default=None)


在 views 寫資料:


from myproj.myapp.models import MyDatetime

def MyInsert(request):
_myid = request.POST.get('myid',None) or request.GET.get('myid',None)
_mydate1 = request.POST.get('mydate1',None) or request.GET.get('mydate1',None)
#_mydate2 = request.POST.get('mydate2',None) or request.GET.get('mydate2',None)

try: # 格式轉換, 假設 mydate1 輸入格式是 "%Y/%m/%d %H:%M:%S",無法直接使用,需轉成 "%Y-%m-%d %H:%M:%S" 格式
_mydate1 = datetime.datetime.fromtimestamp(time.mktime(time.strptime( _mydate1 , "%Y/%m/%d %H:%M:%S"))).strftime("%Y-%m-%d %H:%M:%S")
except:
_mydate1 = None # mydate1 欄位不能為空,若在此步,繼續進行下去新增資料會出錯

try:
# 先確認此筆資料是否存在,若存在則更新 mydate2
obj = MyDatetime.object.get( myid=_myid )
# 設定 mydate2 為當地時間
obj.mydate2 = strftime( "%Y-%m-%d %H:%M:%S" , localtime() )
obj.save()
except Exception, e:
obj = MyDatetime(
myid = _myid , 
mydate1 = _mydate1 ,

# mydate2 預設可以為 None,所以不輸入也行,但記得 _mydate2 可以為 None 但不能為 '' 字串
#mydate2 = _mydate2 ,
)
obj.save()


查詢資料時,使用 QuerySet 提供多重的條件限制:


from django.db.models import Q

from django.shortcuts import render_to_response
from django.template import RequestContext
from django import http
 
import simplejson

def MyQuery(request):
_myid = request.POST.get('myid',None) or request.GET.get('myid',None)
  _mydate1 = request.POST.get('mydate1',None) or request.GET.get('mydate1',None)
_mydate2 = request.POST.get('mydate2',None) or request.GET.get('mydate2',None)
 
# 使用 and 條件
try:
obj = MyDatetime.object.get( Q(myid=_myid) & Q(mydate1=_mydate1) )
except:
pass
 
  # 使用 or 條件
try:
obj = MyDatetime.object.get( Q(myid=_myid) | Q(mydate1=_mydate1) )
except:
pass

# 多重條件 ( ( myid == _myid || mydate1 == _mydate1 ) && ( mydate2 == _mydate2 ) )
try:
obj = MyDatetime.object.get( Q( Q(myid=_myid) | Q(mydate1=_mydate1) ) & Q(mydate2=_mydate2) )
except:
pass

# 使用大小判斷 great than , less than, equal
try:
obj_list = list( MyDatetime.object.filter( Q(mydate1__gt=_mydate1) ) )
except:
pass
try:
obj_list = list(  MyDatetime.object.filter( Q(mydate1__lt=_mydate1) ) )
except:
pass
try:
obj_list = list( MyDatetime.object.filter( Q(mydate1__gte=_mydate1) ) )
except:
pass
try:
obj_list = list( MyDatetime.object.filter( Q(mydate1__lte=_mydate1) ) )
except:
pass

_result = {}

# 取出 list 並 sorting
try:
obj_list = list( MyDatetime.object.all() )
obj_list.sort( cmp=lambda x,y: cmp( x.myid , y.myid ) )
output = []
for obj in obj_list:
_obj = {}
_obj['myid'] = obj.myid
output.append( _obj )
_result['result'] = output
exception:
pass

# 回傳 JSON 格式
result=simplejson.dumps(_result)
return http.HttpResponse(str(result))


沒有留言:

張貼留言