【问题标题】:Is there a way to get all backrefs a model has in peewee?有没有办法获得模型在 peewee 中的所有反向引用?
【发布时间】:2021-03-24 21:29:47
【问题描述】:

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

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')

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

有什么方法可以实现吗?

【问题讨论】:

    标签: python peewee


    【解决方案1】:

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

    您也可以使用ModelClass._meta.model_graph(refs=False, backrefs=True),它返回一个三元组列表(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)]
    

    【讨论】:

    • 就是这样!如果我在类中使用“for fk in self._meta.backrefs”进行迭代,我会得到引用它的外键。然后使用“fk.backref”,我在创建类时获得分配给 backref 的名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2021-07-05
    • 2020-08-25
    相关资源
    最近更新 更多