通过项目来深入理解tornado(八):小组列表页完成
通过项目来深入理解tornado(八):小组列表页完成
前言
上次解决了新建小组的功能
现在来完善小组的列表展示页面
主要的思路就是从数据库取出所有数据,然后根据条件进行筛选,然后返回给前端
import os
import json
from playhouse.shortcuts import model_to_dict
from tornado_bbs.handler import BaseHandler
from tools.auth_dec import authenticated
from .forms import CommunityGroupForm
import aiofiles
import uuid
from .models import CommunityGroup
from tools.help_func import json_time
class GroupHandler(BaseHandler):
async def get(self, *args, **kwargs):
re_data = []
all_group = CommunityGroup.extend()
c = self.get_argument('c', None)
if c:
all_group = all_group.filter(CommunityGroup.category == c)
o = self.get_argument('o', None)
if o:
if o == 'hot':
all_group = all_group.order_by(CommunityGroup.member_nums.desc())
elif o =='new':
all_group = all_group.order_by(CommunityGroup.add_time.desc())
limit = self.get_argument('limit', None)
if limit:
all_group = all_group.limit(int(limit))
groups = self.application.objects.execute(all_group)
for group in groups:
group_dict = model_to_dict(group)
group_dict['front_image'] = "{}/media/{}".format(self.settings['web_site'], group['front_image'])
re_data.append(group_dict)
self.finish(json.dumps(re_data, default=json_time))
逻辑虽然简单但是里面坑还是不少的
1.首先是peewee的坑,在生成有外键的的表的查询语句时,需要自己手动组装查询外键的语句,可以放在类里面
例如:
class CommunityGroup(BaseModel):
creator = ForeignKeyField(User, verbose_name="创建者")
name = CharField(max_length=100, null=True, verbose_name="名称")
category = CharField(max_length=20, verbose_name="分类", null=True)
front_image = CharField(max_length=200, null=True, verbose_name="封面图")
desc = TextField(verbose_name="简介")
notice = TextField(verbose_name="公告")
#小组的信息
member_nums = IntegerField(default=0, verbose_name="成员数")
post_nums = IntegerField(default=0, verbose_name="帖子数")
@classmethod
def extend(cls):
return cls.select(cls, User.id, User.nick_name).join(User)
2.传递少量数据可以手动生成json,但是大量数据可以用model_to_dict方法
例如:
from playhouse.shortcuts import model_to_dict
group_dict = model_to_dict(group)
3.json不能dumps datetime和date类型
需要额外写个函数解决,利用obj.isoformat函数
from datetime import datetime, date
def json_time(obj):
if isinstance(obj , (date,datetime)):
return obj.isoformat()
else:
raise TypeError
然后设置default=该函数名称。注意是名称,不带括号
self.finish(json.dumps(re_data, default=json_time))

浙公网安备 33010602011771号