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

  

posted @ 2018-11-28 12:31  __Miracle  阅读(214)  评论(0编辑  收藏  举报