ホテル料金の一覧をフィルタリングするクエリを作成しようとしています。私は、今日から将来へのホテル予約を表示したいだけです。私が作成したクエリは以下の通りですが、結果をフィルタリングしません。私は間違って何をしていますか?背景についてはSqlalchemy日付でフィルタ
hotels = db.session.query(Hotel).\
join(Location).\
join(Rate).\
filter(Location.city == city).\
filter(Rate.arrive > datetime.utcnow())
、私のモデルは次のようになります。
class Location(Base):
__tablename__ = 'locations'
id = Column(Integer, primary_key=True)
city = Column(String(50), nullable=False, unique=True)
hotels = relationship('Hotel', back_populates='location')
class Hotel(Base):
__tablename__ = 'hotels'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False, unique=True)
phone_number = Column(String(20))
parking_fee = Column(String(10))
location_id = Column(Integer, ForeignKey('locations.id'), nullable=False)
location = relationship('Location', back_populates='hotels')
rates = relationship('Rate', back_populates='hotel', order_by='Rate.arrive')
class Rate(Base):
__tablename__ = 'rates'
id = Column(Integer, primary_key=True)
price = Column(Numeric(6, 2))
arrive = Column(Date, nullable=False)
link = Column(String(500), nullable=False)
updated = Column(DateTime, default=datetime.datetime.utcnow, nullable=False)
hotel_id = Column(Integer, ForeignKey('hotels.id'), nullable=False)
hotel = relationship('Hotel', back_populates='rates')
編集:
Date: Friday, Sep 9
Rate: 299.25
Date: Sunday, Sep 11
Rate: 261.75
Date: Monday, Sep 12
Rate: 261.75
Date: Tuesday, Sep 13
Rate: 261.75
Date: Sunday, Sep 18
除去フィルター(Rate.arrive> datetime.utcnow(:ここに は、いくつかのサンプルデータであり、 ))はデータを変更しません。クエリを実行するたびに同じ結果が出力されます。
contains_eagerを使用していますか?あなたは 'filter(Rate.arrive> datetime.utcnow()'を削除した場合と同じですか?または結果が空ですか?*サンプルデータと期待されるクエリ結果は助けになります* – van
サンプルデータを追加しました。 – Casey
あなたのクエリは 'Hotel'インスタンスを返し、クエリのロジックは次のようになります:* **少なくとも**がある興味のある都市のホテルを返します* datetime.datetime.utcnow()の後に少なくとも1つの* Rateがある場合、ホテルが返されます。これはあなたが望むものではありませんか? – van