有没有办法获取模型在 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.backrefs
和 ModelClass._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)]
我有一个继承自 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.backrefs
和 ModelClass._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)]