料理:カレー
材料:じゃがいも、玉ねぎ、鶏肉
を1つの料理として登録し、
料理のカレーが消去された際には、カレーに関連付けられている材料が全て消去される様にしたいのですが、以下のエラーが出てしまいます。cascade等を具体的にどこにどの様に設定すれば良いでしょうか。
(現在は料理がカレーだけですが、多対多でのリレーションテーブル同士での想定です)
エラー表記 AssertionError: Dependency rule tried to blank-out primary key column 'menu_zairyou_relationtable.zairyou_id' on instance '<MenuZairyou at 0x1091751c0>'
以下が作成したコードです
python3
1class Menu(Base): 2 __tablename__ = 'menu_table' 3 id = Column(Integer,primary_key=True) 4 menu_name = Column(String(100),nullable=False) 5 6 zairyous = relation( 7 'Zairyou', 8 secondary='menu_zairyou_relationtable', 9 cascade='all, delete' 10 ) 11 12 13class Zairyou(Base): 14 __tablename__ = 'zairyou_table' 15 id = Column(Integer,primary_key=True) 16 zairyou_name = Column(String(100),nullable=False) 17 18 menus = relation( 19 'Menu', 20 secondary='menu_zairyou_relationtable', 21 passive_deletes=True 22 ) 23 24 25class MenuZairyou(Base): 26 __tablename__ = 'menu_zairyou_relationtable' 27 28 menu_id = Column(Integer,ForeignKey(Menu.id),primary_key=True) 29 zairyou_id = Column(Integer,ForeignKey(Zairyou.id), primary_key=True) 30 31 menu = relation( 32 'Menu', 33 backref='menu_zairyou_relationtable', 34 cascade="all, delete" 35 ) 36 zairyou = relation( 37 'Zairyou', 38 backref='menu_zairyou_relationtable', 39 cascade="all, delete" 40 ) 41 42def main(): 43 Base.metadata.create_all(engine) 44 SessionMaker = sessionmaker(bind=engine) 45 session = SessionMaker() 46 47 # 初回登録 48 new_menu = Menu(menu_name="カレー") 49 new_zairyou = Zairyou(zairyou_name='じゃがいも') 50 s = MenuZairyou(menu = new_menu, zairyou = new_zairyou) 51 session.add(s) 52 session.commit() 53 54 # カレーの材料を追記 55 new_zairyou = Zairyou(zairyou_name='玉ねぎ') 56 s = MenuZairyou( 57 menu=session.query(Menu).filter(Menu.menu_name=="カレー").first(), 58 zairyou = new_zairyou 59 ) 60 # カレーの材料を追記 61 new_zairyou = Zairyou(zairyou_name='鶏肉') 62 s = MenuZairyou( 63 menu=session.query(Menu).filter(Menu.menu_name=="カレー").first(), 64 zairyou = new_zairyou 65 ) 66 session.add(s) 67 session.commit() 68 69if __name__ == '__main__': 70 main()
上記のコードで登録したテーブルの内容は以下の通りです。
menu_table;
+----+-----------+
| id | menu_name |
+----+-----------+
| 1 | カレー |
+----+-----------+
zairyou_table;
+----+-----------------+
| id | zairyou_name |
+----+-----------------+
| 1 | じゃがいも |
| 2 | 玉ねぎ |
| 3 | 鶏肉 |
+----+-----------------+
menu_zairyou_relationtable;
+---------+------------+
| menu_id | zairyou_id |
+---------+------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
+---------+------------+
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/28 08:39
2020/09/29 07:21
2020/09/29 08:52