使用一种方法作为Flask中可搜索的炼金术

2024-05-19 14:31:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个sqlalchemy模型,我正在用flask whooshemmy搜索。我希望在搜索字段中包含一个方法的输出,但无法确定它是如何完成的,或者是否有可能。烧瓶呼啸炼金术的文档有点有限。在

我正在尝试这样的方法:

class Trade(db.Model):
    __searchable__ = [
        'species', 'nature', 'ability', 'move1', 'move2', 'move3', 'move4', 'ivSpread']

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    dex_no = db.Column(db.Integer)
    species = db.Column(db.String(30))
    male = db.Column(db.Boolean)
    female = db.Column(db.Boolean)
    nature = db.Column(db.String(30))
    ability = db.Column(db.String(30))
    iv_hp = db.Column(db.Integer)
    iv_atk = db.Column(db.Integer)
    iv_def = db.Column(db.Integer)
    iv_spa = db.Column(db.Integer)
    iv_spd = db.Column(db.Integer)
    iv_spe = db.Column(db.Integer)
    move1 = db.Column(db.String(30))
    move2 = db.Column(db.String(30))
    move3 = db.Column(db.String(30))
    move4 = db.Column(db.String(30))

    def ivSpread(self):
        ivs = [
            self.iv_hp,
            self.iv_atk,
            self.iv_def,
            self.iv_spa,
            self.iv_spd,
            self.iv_spe
        ]
        return "/".join(ivs)

    def __repr__(self):
        return '<Post %r: %r>' % (self.owner.nickname, self.species)

如果我能提供更多信息,请告诉我。使用替代模块的建议也很好,我相信会有比烧瓶呜呜炼金术更强大的东西。毕竟已经两年没推了。在

e:按原样使用上面的内容,再加上下面markhildreth提供的@property建议,我得到以下回溯。在

^{pr2}$

Tags: 方法selfiddbstring烧瓶defcolumn
1条回答
网友
1楼 · 发布于 2024-05-19 14:31:35

我对Woosh或Flask Wooshalchemy知之甚少,所以这可能是错误的,但我想你可能会做这样的事情。。。在

class Trade(db.Model):
    #...

    @property
    def ivSpread(self):
        #...

这使用了一个property使方法调用看起来像一个属性,所以不要做。。。 t=贸易(…) 打印t.ivSpread()

…你会。。。在

^{pr2}$

这是必要的,因为Flask-WooshAlchemy似乎假定可搜索项是一个属性,而此时它只是在不调用方法的情况下拉取该方法。在

如果需要使用ivSpread stay方法,可以使用包装器:

class Trade(db.Model):
    #...

    def ivSpread(self):
        #...

    @property
    def ivSpreadProp(self):
        return self.ivSpread()

然后您需要使ivSpreadProp可搜索,而不是ivSpread。在

编辑:

看来你要做的事情目前还不可能。参见here

searchable = set(model.__searchable__)
for field in model.__table__.columns:
    if field.primary_key:
        schema[field.name] = whoosh.fields.ID(stored=True, unique=True)
        primary = field.name

    if field.name in searchable and isinstance(field.type,
            (sqlalchemy.types.Text, sqlalchemy.types.String,
                sqlalchemy.types.Unicode)):

        schema[field.name] = whoosh.fields.TEXT(
                analyzer=StemmingAnalyzer())

Flask whooshelchemy假设__searchable__属性中的项将是由模型使用SQLAlchemy定义的列。烧瓶呼啸炼金术需要让你干净地实现你的目标。在

相关问题 更多 >