通过项目来深入理解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))