{ { 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 Qfrom 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):
print‘args =‘, args
print‘kwargs =‘, 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)