on_delete='CASCADE'似乎有n

2024-10-01 05:00:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在两个模型之间有一个多对多的关系,User和{},通过一个中间表UserRoleThrough实现,它有两个{}:一个引用User,另一个引用Role。我从文档中了解到,ON DELETE功能是通过使用on_delete参数初始化ForeignKeyField来支持的。虽然不太清楚on_delete可以取什么值,documentation给出了一个例子,例如'CASCADE'。尽管如此,on_delete='CASCADE'似乎没有效果,因为试图从父表中删除一行会引发错误。在

peewee.IntegrityError: FOREIGN KEY constraint failed

使用数据库浏览器检查生成的架构会发现外键不是用ON DELETE声明的。在

^{pr2}$

我做错什么了?如何使on_delete工作?下面是一个使用Python3.6和Peewee 3.0.2的最小可重复性示例。在

import peewee

db_proxy = peewee.Proxy()

class BaseModel(peewee.Model):
    class Meta:
        database = db_proxy

class User(BaseModel):
    name = peewee.CharField()

class Role(BaseModel):
    name = peewee.CharField()

class UserRoleThrough(BaseModel):
    user = peewee.ForeignKeyField(User, on_delete='CASCADE')
    role = peewee.ForeignKeyField(Role, on_delete='CASCADE')


if __name__ == '__main__':
    db = peewee.SqliteDatabase('test.db')
    db.pragma('foreign_keys', 1, permanent=True)
    db_proxy.initialize(db)

    tables = [
        User,
        Role,
        UserRoleThrough
    ]
    db.create_tables(tables)

    isaac = User.create(name='Isaac')
    admin = Role.create(name='Admin')
    UserRoleThrough.create(user=isaac, role=admin)
    User.delete().execute()

Tags: namedbtablesoncreatedeleteclasscascade