大家写 Django 用 class-based view 吗?

2014-03-21 08:34:06 +08:00
 cbsw
之前为了早日实现功能,匆匆用function views完成了,后来看文档发现有个class-based views(Tutorial里提到过的早忘了),用起来很方便。刚入手不太明白怎么写class-based view,去看 https://github.com/python/pythondotorg 发现全是用的class-based view。所以想问下大家是全用class-based view还是混合着用,我有没有必要将function views都改成class-based views呢
4280 次点击
所在节点    Python
14 条回复
est
2014-03-21 08:45:11 +08:00
如果以同一个URL有这种结构:

def myview(request):
  my object = ..
  if request.method=='GET':
    xxx
  elif request.method=='POST':
    yyy

那么可以考虑使用class based view
cbsw
2014-03-21 09:02:40 +08:00
@est 有些函数是这样的。做一个类似V2EX的网站,node下面显示topics,这个可以用ListView,怎么把每个topic的回复数显示在topic下面呢,get_context_data的数据好像没法和model同时遍历
RIcter
2014-03-21 09:33:49 +08:00
@cbsw 如果是分表的话应该是主题对回复是一对多。查询的话架设某主题id是1好了然后

Reply.objects.count(topic__id=1)应该就是回复数了
gaicitadie
2014-03-21 09:46:08 +08:00
感觉没必要,网站的结构不是按Class走的,也不是按restful走的。各种需求会把结构打的七零八落
paomian
2014-03-21 09:53:13 +08:00
yueyoum
2014-03-21 10:02:40 +08:00
LZ 肯定没写过 reusable app
cbsw
2014-03-21 11:05:20 +08:00
@RIcter 这样用是错的,应该是 Reply.objects.filter(topic__id=1).count()。 查询我知道,用了ListView后在template里不是用object_list遍历topic吗,如何将回复数在遍历的同时添加到topic下面?
@yueyoum 你猜对了,还没写过大型项目呢,面向对象的技术也没学过,所以写程序时出发点都是面向过程的
RIcter
2014-03-21 11:43:58 +08:00
@cbsw 我记错了那就Σ(゚Д゚)
你可以通过topic取reply啊。。
cbsw
2014-03-21 12:12:25 +08:00
@RIcter 可以直接在template中用 topic.reply_set.count 获得回复数
cbsw
2014-03-21 12:18:09 +08:00
果然用class-based view省去了好多代码
geeklian
2014-03-21 12:18:18 +08:00
我是全部用的class base。

优点显而易见啊。

配置一个BaseView

然后处理通用的GET请求,譬如?page=xxx之流,全都放入def dispatch下。
lzjun
2014-03-21 13:26:04 +08:00
好,我也决定改造一下
raquelken
2014-03-21 15:11:22 +08:00
@cbsw
node下面有100个topic不是要多100条select?
要善用extra
Topic.objects.extra(
select={
'reply_amount': """SELECT COUNT(*) FROM reply
WHERE reply.id = topic.id """,
},
).filter()
cbsw
2014-03-21 18:07:46 +08:00
@raquelken 不错,学习了。不过用django的话,一般都尽量避免使用 raw sql queries 吧,另外这个跟我那个方法差别不大吧,model在ListView里已经设置好了,在template里遍历Topic时,顺带用topic.reply_set.count就将回复数取出来了,每条topic的reply_count也就查询一次啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/105216

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX