我有一个Order - FoodItem
多对多关系,如下所示:
association_table = db.Table('association', db.Model.metadata,
db.Column('left_id', db.Integer, db.ForeignKey('orders.order_id')),
db.Column('right_id', db.Integer, db.ForeignKey('fooditems.fooditem_id'))
)
class OrderModel(ReviewableModel):
__tablename__ = 'orders'
order_id = db.Column(db.Integer, db.ForeignKey('reviewables.id'), primary_key=True)
food_items = db.relationship("FoodItemModel", secondary = association_table)
__mapper_args__ = {'polymorphic_identity':'orders'}
class FoodItemModel(ReviewableModel):
__tablename__ = 'fooditems'
fooditem_id = db.Column(db.Integer, db.ForeignKey('reviewables.id'), primary_key=True)
__mapper_args__ = {'polymorphic_identity':'fooditems'}
用户可以请求具有重复foodItems的订单。这是正确创建的,但是当我将更改保存到数据库时,重复项将被删除。例如,我点了3个比萨饼:
^{pr2}$输出如下:
before: [<FoodItemModel u'Pizza'>, <FoodItemModel u'Pizza'>, <FoodItemModel u'Pizza'>]
after: [<FoodItemModel u'Pizza'>]
关联表已正确更新:
"left_id" "right_id"
"6" "3"
"6" "3"
"6" "3"
但是,OrderModel中的food_项仅包含1项
必须声明关联表的主键。在
Flask SQLALchemy是一个ORM,它需要一系列唯一标识行的列。在
看一下这部分文档,有点过时,但仍然有效: http://docs.sqlalchemy.org/en/rel_1_1/faq/ormconfiguration.html#faq-mapper-primary-key
Flask SQLALchemy使用所有字段(left_id,right_id)来标识行,并且所有行都具有相同的值(6,3)。因此,所有的行都存储在数据库中(因为它没有任何声明的约束),但是上下文(内存)中只保留一行。在
Juan Mellado在他的answer中得到的是关系数据(RD)和对象关系映射(ORM)冲突:ORM无法区分具有相同数据的单独对象。要解决这个问题,只需添加一个}的不同记录。在
id
列作为association_table
的主键,这样ORM就可以区分具有相同left_id
和{但这将是一个解决办法,而不是一个解决办法。在
解决方案是思考“用户可以请求具有重复foodItems的订单”的含义。从订单到食物的关系不是直接的,而是通过订单项目间接的。每个订单项目属于一个订单(订单又属于客户或餐桌),并且每个订单项目都可以与食品项目有关联。通过使每个订单项目都是唯一的,“重复食品项目”的问题就消失了。同时,我们现在可以通过在每个订购项目中添加一个可选的“客户请求”来获得无限量的食品种类。E、 g.“食物:炸薯条,要求:不含盐”。在
下面是一个代码演示,其中客户“我尖叫”下了1个订单,其中3份是“冰淇淋”,其中1份是“顶部有洒布”。在
相关问题 更多 >
编程相关推荐