多表查询 及聚合查询

{{ article.comment_set.all.count }}这么写的原因 是comment做为子表,是ForeignKey关联,内置有count方法,可以直接调用
{% for tag in article.tag.all %} tag是主表,是一个多对多的关系
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。
这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作
十:多表查询常用方式及方法
 
Commnet 为 Article的子表
comment = Comment.objects.filter(user__username='li')用这种双下划线的方式进行判断
二:comment.user.username取出外键当中的内容
主表查询子表:
artilce= Article.objects.get(pk=1)
comment = article.comment_set.content
取出的是id=1的文章的所有评论
 
主表可以查询出所关联的所有子表,子表可以查询出所关联主表的信息,也可以通过查询子表当中的外键到主表中去匹配,从而查询出所有的主表
 
 
 
十一:聚集查询相关方式及方法
 
这个silver好sb啊,Django 的查询就是聚合查询,查询一般是一个QuerySet的集合

Q查询

django.db.models.Q
1、Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如:

from django.db.models import Q
from login.models import New #models对象
news=New.objects.filter(Q(question__startswith='What'))

 

2、可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。

Q(question__startswith='Who') | Q(question__startswith='What')

 

3、Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合

Q(question__startswith='Who') | ~Q(pub_date__year=2005)
 

django *args, **kwargs 用法

 
def foo(*args,**kwargs):
 
printargs =‘, args
 
printkwargs =‘, kwargs
 
print‘—————————————‘
 
if __name__ ==__main__’:
 
foo(1,2,3,4)
 
foo(a=1,b=2,c=3)
 
foo(1,2,3,4, a=1,b=2,c=3)
 
foo(‘a’,1,None, a=1, b=’2′, c=3)
 
 
 
输出结果如下:args =(1,2,3,4)
kwargs ={}
—————————————
args =()
kwargs ={‘a’:1,c’:3,b’:2}
—————————————
args =(1,2,3,4)
kwargs ={‘a’:1,c’:3,b’:2}
—————————————
args =(‘a’,1,None)
kwargs ={‘a’:1,c’:3,b’:2’}
 
 
 
可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个 dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b=’2′, c=3, a’,1,None,)这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。
 
 
 
还有一个很漂亮的用法,就是创建字典:
 
def kw_dict(**kwargs):
 
return kwargs
 
print kw_dict(a=1,b=2,c=3)=={‘a’:1,b’:2,c’:3}
 
还可以这样查询
kwargs['username']='li'
kwargs['username']='wei'
comment =Comment.objects.filter(**kwargs)
 





posted @ 2016-08-08 15:29  意发并行  阅读(396)  评论(0编辑  收藏  举报