You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:36:37