django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct
2019獨角獸企業重金招聘Python工程師標準>>>
1.多表連接查詢:當我知道這點的時候頓時覺得django太NX了。
??class A(models.Model):
????name = models.CharField(u'名稱')
??class B(models.Model):
????aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
1.5 我叫它反向查詢,后來插入記錄1.5,當我知道的時候瞬間就覺得django太太太NX了。
??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實例,然后還可以通過__各種關系查找,真赤激!!!
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
2013/12/12補充:
“在django models中取得一個字段的distinct值”。就是select distinct xxx ?from table_name ...這樣的功能。使用values會生成ValuesQuerySet(形如N個dict組成的list),猜測大數據無額外性能影響,畢竟queryset系列都是使用時才查詢操作的。
xxxx.objects.values("field_name").distinct()
#或者
xxxx.objects.distinct().values("field_name") 
這兩句生成的sql語句相同,原帖地址:http://blog.csdn.net/tsbob/article/details/1340293。
關于緩存:
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. 三種方式性能依次提升。
當queryset非常巨大時,cache會成為問題。此時可以queryset.iterator(),迭代器的用處就不多說了,根據具體需求情況使用。
轉載于:https://my.oschina.net/u/993130/blog/209460
總結
以上是生活随笔為你收集整理的django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MSP430F5529 DriverLi
- 下一篇: mysql5.7下载中文版_mysql5
