记录Django开发心得

www.usus.cc概念层面


概括


Django是属于MVC的Web框架。


Model:负责与数据库www.usus.cc打交道


View:负责获取或者增www.usus.cc强从Models得到的数据


Controller:这是Django本身


Project与App的区别


Project:提供各种配置文件 App:功能的结合,包括Model和view,需要在根目录下添加”__init__.py”,使得Python可以识别


ManyToMany与ForeignKey的区别
www.e78.com

ForeignKey例子:


员工打卡上班的记录——员工可有多次打卡记录,但是一次刷卡记录只能有单一员工属性(一对多)


ManyToMany例子:


一篇文章可以有多个标签,而一个标签对应的文章也可以是多篇的(多对多)


ManyToMany还有一种特殊的www.e78.com结构,非常类似Twitter的Follow。


假设 A Follow了 B,但是B并没有Follow A,他们之间的Follow是不对等的,要实现这种关系,要在Meta里面设置symetric=False


SexyCode


这是我理解后觉得“性感到死”的一些代码:


lambda x, y: x+y 
Lambda其实和JS中的匿名函www.e78.com数有这异曲同工的作用,嫌起名麻烦,就丢进去,Lambda默认返回里面的值,所以不需要return




map(lambda x: x+1, [1,2,3]) #得到[2,3,4] 
也就是每个都执行一次前面的函数




reduce(lambda x, y: x+y, [1,2,3]) #得到6 
也就是每个都和之前的元素执行一次操作




[i for i in xrange(0,100) if i%2==0] 
得到100以下所有偶数。学术上叫“列表推导”,但在现实案例中是遍历的好工具。




Q(**{key:value}) 
我在培训的时候,学到的是Q、F这两个Django函数是不接受字符串的,即 Q("abc=1") 是不能接受的。但是这段代码性感之处就是彻底摆脱了这条束缚(其实就是重写了keyword对),可以随意构造你喜欢的查询段,这在构造搜索功能时十分有用。比如:

www.e78.com


q_dict = reduce(lambda x,y: x&y, [ Q(**{"%s__slug_name" % taxonomy:request.GET.get(taxonomy)}
    ) for taxonomy in request.GET.keys() if taxonomy in SEARCHABLE_LIST ])
@property 
这个@符号的用法叫“修饰器”,个人感觉这是python比其他语言优美的地方,如何构造修饰器的话,还是看文档的好。这里只是说在class中使用 @property 的话,这个函数就自动地变成class的属性了,这和js的set、get很像
super超类的使用,super一出,继承的子class一概不执行自身的函数,而是执行super指定的函数
annotate和aggregate。这两个家伙在构造新的query_set时非常有用。比如要统计出一台电脑的总价时,在ComputerManager里面使用


def get_query_set(self):
query_set = super(ComputerManager, self).get_query_set()
query_set = query_set.annotate(price=Sum('devices__price'))
这样,每台电脑就有了总价格。这在构造商品集的时候很方便,但是admin.py的编写就略显罗嗦了。


Error集


取出数据时:XXManager object is not iterable


这是因为Django不会在执行代码过程中得出SQL语句并查询(所以想获得Sql语句也是不可能的)。所以需要使用.get(),.all(),.filter来获得真正的数据实体
概念层面


概括


Django是属于MVC的Web框架。


Model:负责与数据库打交道


View:负责获取或者增强从Models得到的数据


Controller:这是Django本身


Project与App的区别


Project:提供各种配置文件 App:功能的结合,包括Model和view,需要在根目录下添加”__init__.py”,使得Python可以识别


ManyToMany与ForeignKey的区别


ForeignKey例子:


员工打卡上班的记录——员工可有多次打卡记录,但是一次刷卡记录只能有单一员工属性(一对多)


ManyToMany例子:


一篇文章可以有多个标签,而一个标签对应的文章也可以是多篇的(多对多)


ManyToMany还有一种特殊的结构,非常类似Twitter的Follow。


假设 A Follow了 B,但是B并没有Follow A,他们之间的Follow是不对等的,要实现这种关系,要在Meta里面设置symetric=False


SexyCode


这是我理解后觉得“性感到死”的一些代码:


lambda x, y: x+y 
Lambda其实和JS中的匿名函数有这异曲同工的作用,嫌起名麻烦,就丢进去,Lambda默认返回里面的值,所以不需要return




map(lambda x: x+1, [1,2,3]) #得到[2,3,4] 
也就是每个都执行一次前面的函数




reduce(lambda x, y: x+y, [1,2,3]) #得到6 
也就是每个都和之前的元素执行一次操作




[i for i in xrange(0,100) if i%2==0] 
得到100以下所有偶数。学术上叫“列表推导”,但在现实案例中是遍历的好工具。




Q(**{key:value}) 
我在培训的时候,学到的是Q、F这两个Django函数是不接受字符串的,即 Q("abc=1") 是不能接受的。但是这段代码性感之处就是彻底摆脱了这条束缚(其实就是重写了keyword对),可以随意构造你喜欢的查询段,这在构造搜索功能时十分有用。比如:




q_dict = reduce(lambda x,y: x&y, [ Q(**{"%s__slug_name" % taxonomy:request.GET.get(taxonomy)}
    ) for taxonomy in request.GET.keys() if taxonomy in SEARCHABLE_LIST ])
@property 
这个@符号的用法叫“修饰器”,个人感觉这是python比其他语言优美的地方,如何构造修饰器的话,还是看文档的好。这里只是说在class中使用 @property 的话,这个函数就自动地变成class的属性了,这和js的set、get很像
super超类的使用,super一出,继承的子class一概不执行自身的函数,而是执行super指定的函数
annotate和aggregate。这两个家伙在构造新的query_set时非常有用。比如要统计出一台电脑的总价时,在ComputerManager里面使用


def get_query_set(self):
query_set = super(ComputerManager, self).get_query_set()
query_set = query_set.annotate(price=Sum('devices__price'))
这样,每台电脑就有了总价格。这在构造商品集的时候很方便,但是admin.py的编写就略显罗嗦了。


Error集


取出数据时:XXManager object is not iterable


这是因为Django不会在执行代码过程中得出SQL语句并查询(所以想获得Sql语句也是不可能的)。所以需要使用.get(),.all(),.filter来获得真正的数据实体
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值