2017-10-22 8 views
0

私はクライアントがサービスの予約をすることができる小さな予約アプリケーションを作成しました。また、特定の日付に検索するためのフォーム検索も行っています。フラスカで予約可能なすべてのユーザーを並べ替えるには?

結果は、利用可能なすべてのユーザーである必要があります。ただし、そのうちの1人がクライアントによって特定の日付にビジー状態である場合を除きます。

は、ここに私のmodels.pyです:

class User(db.Model, UserMixin): 

    __tablename__ = 'user' 

    id = db.Column(db.Integer(), primary_key=True) 
    public_id = db.Column(db.String(50), default=uuid.uuid4) 
    name = db.Column(db.String()) 
    appointments = db.relationship('Appointment', backref='user', passive_deletes=True, lazy='dynamic') 

class Appointment(db.Model): 
    id = db.Column(db.Integer(), primary_key=True) 
    public_id = db.Column(db.String(50), default=uuid.uuid4) 
    start_time = db.Column(db.DateTime(), default=datetime.utcnow) 
    end_time = db.Column(db.DateTime(), default=datetime.utcnow) 
    user_id = db.Column(db.Integer(), db.ForeignKey('user.id', ondelete='CASCADE')) 

はここに私のコードです:私は何も得る結果で

from datetime import timedelta 
from dateutil.parser import parse 

date_time = parse(request.form.get('datetime')) 
end_time = date_time + timedelta(minutes=20) 
overlapping = db.session.query(Appointment).filter(
    not_(
     or_(Appointment.start_time > end_time, 
      Appointment.end_time < date_time))) 
overlapping.count() # if overlapping returns > 0 so the client can't book 

# Here i am joining the two tables so i can get the available users on that date 
results = User.query.join(Appointment, Appointment.user_id == User.id).filter(
      Appointment.start_time > end_time).filter(
      Appointment.end_time < date_time).all() 

ご意見ください!

+0

変数 'date'とは何ですか? start_timeはend_timeよりも大きいはずですか?私はその部分を本当に理解していません。 – Jonathan

+0

私は最初のスニペットで質問を更新しました。選択した時刻がデータベースの日付時刻の間にあるかどうかを確認しようとしています。そうであれば、ユーザーが選択した日付がビジーでなければなりません。 – swordfish

+0

コードの2番目のスニペットでは、私は忙しいもの以外のすべての他のユーザーを取得しようとしています。 – swordfish

答えて

0

だから私はこの問題は、すべてのユーザーが無料である場合があるということです。つまり、誰も予定がありません.FKでマッチングしているので、その外来キーと一致する結果しか得られません。したがって結果はありません。あなたはINNER JOINをしています。

結果が表示されないのではなく、ユーザーに対して結果を表示する必要があります。だから、インナー・ジョイントをする代わりにLEFT OUTER JOINをしたいと思うかもしれません。

私は上記のことを行うべきだと思います。

+0

あなたの関心をお寄せいただきありがとうございます、私はあなたのコードを試してみましたが、結果はありませんでした。なぜあなたは余分なパラメータとしてisouterを使用しているのか説明してください。 – swordfish

+0

ここでisouterについて読むことができます:http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.join.params.isouter – Jonathan

+0

私は本当に選択したものがビジー状態で、その結果が空きのユーザーだけを返すはずですが、 'len(結果)'は何も得られません。** 0 **です。 – swordfish

関連する問題