Python Peewee 中同一个表的外键

Mic*_*hal 5 python database sqlite foreign-keys peewee

我在 Python 中使用 ORM peewee来实现 sqlite。我想创建一个表,其中的Item字段parent_id将作为外键Item

from peewee import *

db = SqliteDatabase("data.db")

class Item(Model):
    id = AutoField()
    parent_id = ForeignKeyField(Item, null = True)

    class Meta:
        database = db

db.create_tables([Item])
Run Code Online (Sandbox Code Playgroud)

但是,由于循环外键,出现错误:

NameError:在封闭范围内赋值之前引用了自由变量“Item”

DeferredForeignKey对于这种情况, peewee中有:

from peewee import *

db = SqliteDatabase("data.db")

class Item(Model):
    id = AutoField()
    parent_id = DeferredForeignKey("Item", null = True)

    class Meta:
        database = db

db.create_tables([Item])
Item._schema.create_foreign_key(Item.parent_id)
Run Code Online (Sandbox Code Playgroud)

不幸的是,sqlite中没有ADD CONSTRAINT,所以出现另一个错误:

peewee.OperationalError:靠近“CONSTRAINT”:语法错误

有没有办法使用 peewee 在 sqlite 中创建循环外键,或者我必须使用纯整数而不是外键或使用本机 SQL 而不是 ORM?

col*_*fer 9

这有非常清楚的记录:http://docs.peewee-orm.com/en/latest/peewee/models.html#self-referential-foreign-keys

您只需将'self'其作为标识符:

class Item(Model):
    id = AutoField()
    parent = ForeignKeyField('self', backref='children', null=True)

    class Meta:
        database = db
Run Code Online (Sandbox Code Playgroud)

您不需要弄乱任何延迟的密钥或任何东西。