Peewee中ForeignKeyField如何正确引用同模型自身?
报错原因
你定义parent外键字段时,Domain类还没走完类定义的流程,Python解释器执行到这行代码的时候,内存里还没有Domain这个类的标识,自然会报未定义的错误。
正确实现方案
Peewee本身对自引用外键做了专门支持,不需要绕弯子提前声明类,只要把ForeignKeyField里传入的模型参数换成特殊字符串'self'就行,框架会自动把这个外键关联到当前正在定义的模型上。
修正后的代码:
from peewee import * class Domain(Model): owner = CharField(max_length=40) resolves_to = CharField(max_length=40) name = CharField(max_length=26) last_renewal = IntegerField(null=True) # null=True means that it is optional ending_date = IntegerField() active = BooleanField() # 传入'self'表示自关联,backref是可选配置,用来声明反向引用的属性名 parent = ForeignKeyField('self', null=True, backref='children') class Meta: db_table = "domain"
注意事项
- 你之前给
parent字段加的null=True是必要配置:根层级的域名没有父级,必须允许字段为空才能正常存储这类记录。 backref='children'是可选项,如果加了这个配置,后续拿到某个父域名实例后,可以直接通过domain_instance.children拿到所有关联的子域名记录,不用单独写查询,不需要反向关联的话删掉这个参数就行。
内容的提问来源于stack exchange,提问作者BigP
相关产品推荐
相关产品推荐

