Django-ORM 使用

1.多表鏈接查詢(Django ORM 神器)。sql

class A(models.Model):
    name = models.CharField(u'名稱')
  class B(models.Model):
    aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')

-> 反向查詢(Django ORM 神器)數據庫

class A(models.Model):
    name = models.CharField(u'名稱')
  class B(models.Model):
    aa = models.ForeignKey(A,related_name="FAN")
    bb = models.CharField(u'名稱')

查A: A.objects.filter(FAN__bb='XXXX'),都知道related_name的做用,A.FAN.all()是一組以A爲外鍵的B實例,可前面這樣的用法是查詢出全部(B.aa=A且B.bb=XXXX)的A實例,而後還能夠經過__各類關係查找.django

2.條件選取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

例子:性能

>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>> q3 = q1.filter(pub_date__gte=datetime.date.today())
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")

即q1.filter(pub_date__gte=datetime.date.today())表示爲時間>=now,q1.exclude(pub_date__gte=datetime.date.today())表示爲<=now大數據

補充:
「在django models中取得一個字段的distinct值」。就是select distinct xxx from table_name ...這樣的功能。使用values會生成ValuesQuerySet(形如N個dict組成的list),猜想大數據無額外性能影響,畢竟queryset系列都是使用時才查詢操做的。
x.objects.values("field_name").distinct()

x.objects.distinct().values("field_name") 
這兩句生成的sql語句相同,原帖地址:http://blog.csdn.net/tsbob/article/details/1340293.net

關於緩存:
queryset是有緩存的,a = A.objects.all(),print [i for i in a].第一次執行打印會查詢數據庫,而後結果會被保存在queryset內置的cache中,再執行print的時候就會取自緩存。
不少時候會遇到僅需判斷queryset是否爲空的狀況,能夠1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 三種方式性能依次提高。code

相關文章
相關標籤/搜索