Я использовал flask-sqlalchemy для создания миксина в файле с именем itemAbstract.py
, который будет использоваться двумя классами моделей: ItemModel
и ItemHistoryModel
соответственно. Ниже приведен код, который я написал в itemAbstract.py
from databaseHandler import databaseHandler
from sqlalchemy.ext.declarative import declared_attr
# pylint: disable=maybe-no-member
class Item(databaseHandler.Model):
__abstract__ = True
itemName = databaseHandler.Column(databaseHandler.String(80), nullable = False)
price = databaseHandler.Column(databaseHandler.Numeric, nullable = False)
itemImage = databaseHandler.Column(databaseHandler.String(1000), nullable = False)
@classmethod
@declared_attr
def restaurantId(cls):
return databaseHandler.Column(
databaseHandler.Integer, databaseHandler.ForeignKey("restaurant.restaurantId"))
@classmethod
@declared_attr
def restaurant(cls):
return databaseHandler.relationship(
"RestaurantModel", backref=databaseHandler.backref('items', lazy=True))
@classmethod
@declared_attr
def productTypeId(cls):
return databaseHandler.Column(
databaseHandler.Integer, databaseHandler.ForeignKey("product_type.productTypeId"))
@classmethod
@declared_attr
def productType(cls):
return databaseHandler.relationship(
"ProductTypeModel", backref=databaseHandler.backref('items', lazy=True))
И я унаследовал его в itemModel.py
и itemHistoryModel.py
примерно так:
from databaseHandler import databaseHandler
from sqlalchemy import and_, or_
from abstracts.itemAbstract import Item
# pylint: disable=maybe-no-member
class ItemModel(Item):
__tablename__ = 'item'
itemId = databaseHandler.Column(databaseHandler.Integer, primary_key = True)
И
from databaseHandler import databaseHandler
from sqlalchemy import and_, or_
from abstracts.itemAbstract import Item
# pylint: disable=maybe-no-member
class ItemHistoryModel(Item):
__tablename__ = 'item_history'
historyId = databaseHandler.Column(databaseHandler.Integer, primary_key = True)
У меня есть метод класса в обоих файлах, который должен помочь мне получить список товаров, которые продает ресторан, передавая restaurantId
в качестве параметра
@classmethod
def findItemsByRestaurant(cls, param):
return cls.query.filter_by(restaurantId = param)
Однако в любое времяЯ выполняю этот метод, он возвращает строку запроса в наборе результатов вместо списка элементов. Вот примерный набор результатов:
SELECT item_history.`itemName` AS `item_history_itemName`, item_history.price AS item_history_price, item_history.`itemImage` AS `item_history_itemImage`, item_history.`historyId` AS `item_history_historyId`
FROM item_history
WHERE false = 1
Каким-то образом SQLAlchemy делает мой параметр false
и присваивает ему значение 1
, в то время как фактический идентификатор ресторана равен 10
. Что я делаю не так?
Это файл databaseHandler.py
:
from flask_sqlalchemy import SQLAlchemy
databaseHandler = SQLAlchemy()