У меня две модели в MANY TO MANY Relationship, и я хочу получить все значения столбцов в связанных моделях в одном запросе. Но не может получить это с помощью Flask SQLAlchemy.
Но я могу получить требуемые данные с помощью SQL-запроса в phpmyadmin.
Вот запрос
ВЫБОР ply_positions.plyPositionId, ply_positions.plyPositionName, ply_positions.createdAt, ply_positions.updatedAt, product_categories.productCatName ОТ ply_positions РЕГИСТРИРУЙТЕСЬ product_category_ply_position AS product_category_ply_position_1 ПО ply_positions.plyPositionId = product_category_ply_position_1.plyPositionId РЕГИСТРИРУЙТЕСЬ product_categories НА product_categories.productCatId = product_category_ply_position_1.productCatId
Вот код для моделей и ресурсов на Gist: - https://gist.github.com/himadriganguly/c0c9d7e247c286e497998dbd33ce7e84
ВЫХОД:
[{"product_category": [1], "plyPositionId": 2, "updatedAt": null, "product_category_associations": [{"productCatId": 1, "plyPositionId": 2}], "createdAt": 1234, "plyPositionName ":" Flute "}, {" product_category ": [1]," plyPositionId ": 1," updatedAt ": null," product_category_associations ": [{" productCatId ": 1," plyPositionId ": 1}]," createdAt ": 123," plyPositionName ":" Top "}]
Получение вывода таблицы ассоциаций, но не значений столбцов из таблицы product_categories.
Также, создавая отношения, мы используем ленивый два раза, но почему мы делаем это, не ясно для меня.
ply_position = db.relationship('PlyPositionModel', secondary = "product_category_ply_position", lazy = True, backref = db.backref('product_category', lazy = True))
Спасибо всем заранее.
Я думаю, что я понял, что это не вопрос SqlAlchemy, а о том, как вы сериализуете данные. В этом случае я использую колбу-зефир.
Итак, в plyPositionResource.py мне нужно немного изменить схему
ProductCategorySchema
class ProductCategorySchema(ma.ModelSchema):
class Meta:
model = ProductCategoryModel
PlyPositionSchema
class PlyPositionSchema(ma.ModelSchema):
productcategories = fields.List(fields.Nested(ProductCategorySchema))
class Meta:
model = PlyPositionModel
И после этого в функции get вы можете сделать следующее
def get(self):
plyPositionResource = PlyPositionModel.query.order_by(\
PlyPositionModel.plyPositionId.desc())\
.all()
plyPositions = plypositions_schema.dump(plyPositionResource).data
return({"data": plyPositions}, 200)
Надеюсь, это поможет другим.
Если есть другой способ решить проблему, пожалуйста, не стесняйтесь комментировать.