model.object對象查詢過濾、增刪改、Q


 

vm.objects.all()[:10] #獲得前10個對象,不支持負索引
vm.objects.get(name='vmname')
vm.objects.filter(name='vmname') #等價於vm.objects.filter(name__exact='vmname');name__iexact不區分大小寫
vm.objects.filter(name__contains="vm") 
vm.objects.filter(name__regex="^vm") # 正則查詢
vm.objects.filter(name__contains="vm").exclude(ip='192.168.0.1') 
tb.objects.all().exists() #判斷tb中是否為空
tb.objects.all().count() #查詢tb中的對象數量
tb.objects.all().order_by('-name') #對tb中的對象按照name倒序查詢
tb.objects.all().reverse() #倒序取值,但需要已經在model中進行了排序,否則無意義。

  qb=tb.objects.filter(name__contains='b')
  qb.values() #返回值:[{'ip': u'192.168.1.1', 'rating': 0, u'id': 1, 'name': u'aa'}, {'ip': u'192.168.1.110', 'rating': 11, u'id': 3, 'name': u'aa'}]

  qb.values_list() #返回值:[(1, u'aa', u'192.168.1.1', 0), (3, u'aa', u'192.168.1.110', 11)]

  q1.values_list('name','ip') #返回值:[(u'aa', u'192.168.1.1'), (u'aa', u'192.168.1.110')

#新建對象:
vm.objects.create(name='vmname',ip='192.168.1.1')

item=vm(name='vmname',ip='192.168.1.1')
item.save()

item=vm()
item.ip='192.168.1.1'
item.save()
item
=vm(name='vmname') item.ip='192.168.1.1' item.save() vm.objects.get_or_create(name='vmname',ip='192.168.1.1') #先Get,不存在則Create,可以防止重復,但速度要相對慢些,返回一個元組,第一個為對象,第二個為True或False, 新建時返回的是True, 已經存在時返回False.

#修改對象:
item=vm.objects.get(name='vmname')
item.ip='192.168.1.1'
item.save()

 Publisher.objects.all().delete() #刪除所有

 item.delete() #刪除記錄,直接刪除

當key和value都是變量時,無法通過item.key=value方式賦值,可以使用如下方法:

item.__setattr__(key,value) 或者 setattr(obj, key, value)

item.save()

 

filter字段為變量時:

field_name='IPAddress__icontains'
v='192.168.1.3'
hvsrvs.objects.filter(**{field_name: v})

filterconitionname = request.GET['slctdname'] + '__icontains'
dnames = DomainNames.objects.filter(**{filterconitionname:q})

 

#get_or_create條件為變量:
condition = 'IP'
sdict = {condition:'1.1.1.2','APP':'weixin'}

kwargs = {condition:sdict[condition]}
#kwargs = {'{0}'.format('IP'): sdict[condition]} #實際上就是一個dict
IPs.objects.get_or_create(defaults=sdict,**kwargs) #kwargs必須要放在后面
IPs.objects.update_or_create(defaults=sdict,**kwargs)

kwargs = {
'{0}__{1}'.format('name', 'startswith'): 'A',
'{0}__{1}'.format('name', 'endswith'): 'Z'
}
Person.objects.filter(**kwargs)


#Get 條件為變量
condition = 'username'
upwords.objects.get(**{condition:'pymgmtuser'})

 

bulk_create批量創建,不需要顯示調用.save():

aList = [
    Entry(headline="Django 1.0 Released"),
    Entry(headline="Django 1.1 Announced"),
    Entry(headline="Breaking: Django is awesome")
]
Entry.objects.bulk_create(aList)


d1 = {'APP': 'a13', 'cname': '1.2.3.4'}
IPs.objects.bulk_create([IPs(**d1)]) #使用字典的形式創建

  d1['cname'] = hvsrvs.objects.get(serverip='1.1.1.2')  #當bulk_create的字段中存在foreignkey時,例如cname是一個foreignkey
  IPs.objects.bulk_create([IPs(**d1)])

 
         

  ds = [IPs(**d1),IPs(**d2),IPs(**d3)] #d1,d2,d3均為dict
  IPs.objects.bulk_create(ds) #批量創建

 

 

時間過濾:

samples = Sample.objects.filter(sampledate__gt=datetime.date(2011, 1, 1),sampledate__lt=datetime.date(2011, 1, 31))

Sample.objects.filter(date__year='2011', 
date__month='01')

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

  today = datetime.datetime.now()
  p1 = datetime.timedelta(days=1)
  users_today = lockoutusers.objects.filter(lockouttime__range=[today.date(),(today+p1).date()]) #過濾當天

 

過濾 OS_mark等於wd或wa的結果:

obj_list_filters = []
obj_list_filters += model.objects.filter(OS_mark='wa')
obj_list_filters += model.objects.filter(OS_mark='wd')

等價於如下:

from django.db.models import Q
upwords.objects.filter(Q(IP__OS_mark='wd') | Q(IP__OS_mark='wa'))  #|表示or

 

Django中的Q對象查詢:

from django.db.models import Q

upwords.objects.filter(Q(OS_mark='wd') | Q(OS_mark='wa'))  # |表示or,過濾OS_mark=wd或=wa的條目

upwords.objects.filter(Q(OS_mark='wd') & Q(OS_mark='wa'))  # &表示and,過濾OS_mark=wd並且=wa的條目,等價於如下
upwords.objects.filter(Q(OS_mark='wd'),Q(OS_mark='wa'))  # &表示and,過濾OS_mark=wd並且=wa的條目

upwords.objects.filter(Q(IP__OS_mark__icontains='Windows Domain')) #過濾條件 #Q 對象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢 Poll.objects.get( Q(question__startswith='Who'), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) ) #等價於SELECT * from polls WHERE question LIKE 'Who%' AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06') #查詢函數可以混合使用Q 對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q 對象)都將"AND”在一起。但是,如果出現Q 對象,它必須位於所有關鍵字參數的前面 Poll.objects.get( Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)), question__startswith='Who') #如下不合法: Poll.objects.get( question__startswith='Who', Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

 

QuerySet結果集合並:

如果用戶隸屬於某個組,則取出其所有的機器列表

u_groups = [x['name'] for x in request.user.groups.values()]
obj_list_filters = model.objects.none() #設置一個空的QuerySet
if 'upwords-win' in u_groups:
   obj_list_filters = obj_list_filters | model.objects.filter(Q(IP__OS_mark='wa')) | model.objects.filter(Q(IP__OS_mark='waa'))
if 'upwords-linux' in u_groups:
   obj_list_filters = obj_list_filters | model.objects.filter(Q(IP__OS_mark='Linux'))
if 'upwords-network' in u_groups:
   obj_list_filters = obj_list_filters | model.objects.filter(Q(IP__OS_mark='Network'))

print obj_list_filters #中間obj_list_filters變量為空也不受影響,如果用戶屬於多個組,則返回結果為多個obj_list_filters結果相加

 

QuerySet取並集(必須是同一個model):

r1 = model.objects.filter(Q(IP__OS_mark='wa'))
r2 = model.objects.filter(Q(IP__OS_mark='wd'))
r = r1 | r2
print r #返回r1 + r2結果集合,要求r1或r2均不能為空值

QuerySet取並集(可以是不同的model):

from itertools import chain
from yihaomen.common.models import Article, UserID

articles1 = Article.objects.order_by("autoid").filter(autoid__lt = 16).values('autoid','title')
users = UserID.objects.all()

items = chain(articles1, users)
for item in items:
    print item

 

 

get_or_create(defaults=None,**kwargs)   參考:http://www.lihuai.net/program/python/1526.html

obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon',
                  defaults={'birthday': date(1940, 10, 9)})

它根據所給的篩選條件查詢對象,如果對象不存在就創建一個新對象。

它返回的是一個 (object, created) 元組,其中的 object 是所讀取或是創建的對象,而 created 則是一個布爾值,它表示前面提到的 object 是否是新創建的。

update字段:

IPs.objects.get(IP='1.1.12.3') #get結果集不能使用update進行更新,無此方法
IPs.objects.filter(IP='1.1.12.3').update(APP='test333') #filter結果集可以通過update進行更新,無需再save()

 

update_or_create:

srvs = serverinfors.objects.all()
if request.method == 'POST':
    sdict={}
    for k,v in request.POST.items():
        if k <> 'csrfmiddlewaretoken' and len(v) > 0:
            sdict[k] = v.encode('u8') #直接pop(key)不成功
    print sdict
    serverinfors.objects.update_or_create(IP=sdict['IP'],defaults=sdict) #如果sdict['IP']在數據庫中不存在,則新建,存在則更新(defaults內容不檢查)

bulk_create(objs, batch_size=None)

Entry.objects.bulk_create([
    Entry(headline="Django 1.0 Released"),
    Entry(headline="Django 1.1 Announced"),
    Entry(headline="Breaking: Django is awesome")

 

參考:http://www.lihuai.net/program/python/1526.html

reverse()

使用 reverse() 方法會對查詢結果進行反向排序。調用兩次 reverse() 方法相當於排序沒發生改過。

要得到查詢結果中最后五個對象,可以這樣寫:

my_queryset.reverse()[:5]

要注意這種方式與 Python 語法中的從尾部切片是完全不一樣的。在上面的例子中,是先得到最后一個元素,然后是倒數第二個,依次處理。但是如果我們有一個 Python 隊列,使用 seq[-5:]時,卻是先得到倒數第五個元素。Django 之所以采用 reverse 來獲取倒數的記錄,而不支持切片的方法,原因就是后者在 SQL 中難以做好。

還有一點要注意,就是 reverse() 方法應該只作用於已定義了排序項 QuerySet (例如,在查詢時使用了order_by()方法,或是在 model 類當中直接定義了排序項). 如果並沒有明確定義排序項,那么調用 QuerySet, calling reverse() 就沒什么實際意義(因為在調用 reverse() 之前,數據沒有定義排序,所以在這之后也不會進行排序。)

models.py:

from django.db import models

# Create your models here.
class tb(models.Model):
    name=models.CharField(max_length=100)
    ip=models.GenericIPAddressField()
    rating = models.IntegerField()

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['Name']  #排序

dates(field, kind, order=’ASC’)

返回一個 DateQuerySet ,就是提取 QuerySet 查詢中所包含的日期,將其組成一個新的 datetime.date 對象的列表。

field 是你的 model 中的 DateField 字段名稱。

kind 是 “year”, “month” 或 “day” 之一。 每個 datetime.date對象都會根據所給的 type 進行截減。

“year” 返回所有時間值中非重復的年分列表。
“month” 返回所有時間值中非重復的年/月列表。
“day” 返回所有時間值中非重復的年/月/日列表。
order, 默認是 ‘ASC’,只有兩個取值 ‘ASC’ 或 ‘DESC’。它決定結果如何排序。

例子:

>>> Entry.objects.dates('pub_date', 'year')
[datetime.date(2005, 1, 1)]
>>> Entry.objects.dates('pub_date', 'month')
[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]
>>> Entry.objects.dates('pub_date', 'day')
[datetime.date(2005, 2, 20), datetime.date(2005, 3, 20)]
>>> Entry.objects.dates('pub_date', 'day', order='DESC')
[datetime.date(2005, 3, 20), datetime.date(2005, 2, 20)]
>>> Entry.objects.filter(headline__contains='Lennon').dates('pub_date', 'day')
[datetime.date(2005, 3, 20)]

datetimes(field, kind, order=’ASC’)

返回一個 DateTimeQuerySet ,就是提取 QuerySet 查詢中所包含的日期,將其組成一個新的 datetime.datetime 對象的列表。

none()

返回一個 EmptyQuerySet — 它是一個運行時只返回空列表的 QuerySet。它經常用在這種場合:你要返回一個空列表,但是調用者卻需要接收一個 QuerySet 對象。(這時,就可以用它代替空列表)

 

filter條件過濾:

條件選取querySet的時候,filter表示=,exclude表示!=。
querySet.distinct() 去重復
__exact 精確等於 like 'aaa'
__iexact 精確等於 忽略大小寫 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小寫 ilike '%aaa%',但是對於sqlite來說,contains的作用效果等同於icontains。
__gt 大於
__gte 大於等於
__lt 小於
__lte 小於等於
__in 存在於一個list范圍內
__startswith 以...開頭
__istartswith 以...開頭 忽略大小寫
__endswith 以...結尾
__iendswith 以...結尾,忽略大小寫
__range 在...范圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM