3

Python と Web 開発を再検討しています。私は過去に Django を使用していましたが、しばらく経ちました。Flask + SqlAlchemy は私にとってまったく新しいものですが、それによって得られる制御が気に入っています。

はじめに; 以下のコードは、私の開発サーバーで魅力的に機能します。それでも、可能な限り小さく効率的ではないと感じています。誰かが同様のソリューションを構築したかどうか疑問に思っていました。今のところ、単一のクエリを使用してキーワード引数をフォーマットする方法を見つけようとしています。さらに、関数をより再利用可能にするために、関数の周りにクラスを構築すると役立つと思います。

日付に基づいてクエリを作成する関数は次のとおりです。

def live_post_filter(year=None, month=None, day=None):
    """ Query to filter only published Posts exluding drafts 
    Takes additional arguments to filter by year, month and day
    """
    live = Post.query.filter(Post.status == Post.LIVE_STATUS).order_by(Post.pub_date.desc())

    if year and month and day:
        queryset = live.filter(extract('year', Post.pub_date) == year,
                           extract('month', Post.pub_date) == month,
                           extract('day', Post.pub_date) == day).all()
    elif year and month:
        queryset = live.filter(extract('year', Post.pub_date) == year,
                           extract('month', Post.pub_date) == month).all()
    elif year:
        queryset = live.filter(extract('year', Post.pub_date) == year).all()
    else:
        queryset = live.all()

    return queryset

ビューから上記の関数を呼び出す方法は次のとおりです。

@mod.route('/api/get_posts/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/<month>/<day>/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/<month>/', methods = ['GET'])
@mod.route('/api/get_posts/<year>/', methods = ['GET'])
def get_posts(year=None, month=None, day=None):
    posts = live_post_filter(year=year, month=month, day=day)
    postlist = []
    if request.method == 'GET':
    # do stuff 

上で述べたように、これはすべて非常にぎこちなく感じます。アドバイスをいただければ幸いです。

4

1 に答える 1

2

日付コンポーネントでフィルタリングするために を使用するのはextract、私には奇妙に思えます。year代わりに、引数から日付の範囲を返す補助関数を作成しますmonthday

def get_date_range(year=None, month=None, day=None):
    from_date = None
    to_date = None
    if year and month and day:
        from_date = datetime(year, month, day)
        to_date = from_date
    elif year and month:
        from_date = datetime(year, month, 1)
        month += 1
        if month > 12:
            month = 1
            year += 1
        to_date = datetime(year, month, 1)
    elif year:
        from_date = datetime(year, 1, 1)
        to_date = datetime(year + 1, 1, 1)
    return from_date, to_date

そして、クエリ関数ははるかに単純になります:

def live_post_filter(year=None, month=None, day=None):
    """ Query to filter only published Posts exluding drafts 
    Takes additional arguments to filter by year, month and day
    """
    live = Post.query.filter(Post.status == Post.LIVE_STATUS).order_by(Post.pub_date.desc())
    from_date, to_date = get_date_range(year, month, day)
    if from_date and to_date:
        live = live.filter(Post.pub_date >= from_date, Post.pub_date < to_date)
    return live.all()
于 2013-07-20T18:32:59.330 に答える