有没有办法获取模型在 peewee 中的所有反向引用?

Is there a way to get all backrefs a model has in peewee?

我有一个继承自 peewee.Model 的 BaseModel class:

class BaseModel(peewee.Model):
     # Base Model code

我的每个模型都继承自 BaseModel。我的一些模型被其他人引用为外键。每当我将它们作为外键引用时,我都会设置一个反向引用,例如:

class Company(BaseModel):
     name = CharField(null=False)

class User(BaseModel):
     name = CharField(null=False)
     company = ForeignKeyField(Company, backref='users')

 class Campaign(BaseModel):
     name = CharField(null=False)
     created_by = ForeignKeyField(User, backref='campaigns')
     company = ForeignKeyField(Company, backref='campaigns')

给定一个 class 继承自 BaseModel 的对象,我想要一个函数 return 作为输出我可以使用的每个 backref 的列表。例如,如果给我一家公司,我希望 ['users', 'campaigns'] 作为输出。如果是用户,则输出为 ['campaigns']。最后,一个活动将 return [].

有什么办法可以实现吗?

每个模型 class 都将反向引用存储在 ModelClass._meta.backrefsModelClass._meta.model_backrefs 中。你可以递归遍历这些。

或者您可以使用 ModelClass._meta.model_graph(refs=False, backrefs=True) 其中 returns 三元组列表 (fk field, model class, is_backref).

class Base(Model):
    class Meta:
        database = db

class User(Base):
    username = TextField()

class Tweet(Base):
    user = ForeignKeyField(User, backref='tweets')

class Flag(Base):
    tweet = ForeignKeyField(Tweet, backref='flags')
    user = ForeignKeyField(User, backref='flags')


>>> User._meta.backrefs
{<ForeignKeyField: Tweet.user>: <Model: Tweet>,
 <ForeignKeyField: Flag.user>: <Model: Flag>}

>>> User._meta.model_backrefs
defaultdict(list,
            {<Model: Tweet>: [<ForeignKeyField: Tweet.user>],
             <Model: Flag>: [<ForeignKeyField: Flag.user>]})

>>> User._meta.model_graph(refs=False, backrefs=True)
[(None, <Model: User>, None),
 (<ForeignKeyField: Tweet.user>, <Model: Tweet>, True),
 (<ForeignKeyField: Flag.user>, <Model: Flag>, True),
 (<ForeignKeyField: Flag.tweet>, <Model: Flag>, True)]