我正在嘗試構建一個Func基于fuzzystrmatchpostgres 擴展的類工具包。
例如,我有這個包裝器,它接受一個運算式和一個搜索詞并回傳編輯距離:
class Levenshtein(Func):
"""This function calculates the Levenshtein distance between two strings:"""
template = "%(function)s(%(expressions)s, '%(search_term)s')"
function = "levenshtein"
def __init__(self, expression, search_term, **extras):
super(Levenshtein, self).__init__(
expression,
search_term=search_term,
**extras
)
像這樣呼叫,使用F Expression:
Author.objects.annotate(lev_dist=Levenshtein(F('name'),'JRR Tolkien').filter(lev_dist__lte=2)
但是,如果'name'此處的欄位大于 255,則會引發錯誤:
源和目標都可以是任何非空字串,最多 255 個字符。
我可以在使用注釋時截斷名稱Substr:
Author.objects.annotate(clipped_name=Substr(F('name'),1,250))
但我似乎無法弄清楚如何在邏輯放置FUNC,其中我將內側的內側ExpressionWrapper,并設定output_field按照該檔案:
class Levenshtein(Func):
"""This function calculates the Levenshtein distance between two strings:"""
template = "%(function)s(%(expressions)s, '%(search_term)s')"
function = "levenshtein"
def __init__(self, expression, search_term, **extras):
super(Levenshtein, self).__init__(
expression=ExpressionWrapper(Substr(expression, 1, 250), output_field=TextField()),
search_term=search_term,
**extras
)
uj5u.com熱心網友回復:
盡管檔案并沒有說清楚這一點,但通過實驗發現答案是洗掉 的額外定義expression并ExpressionWrapper直接作為第一個引數傳入:
class Levenshtein(Func):
"""This function calculates the Levenshtein distance between two strings:"""
template = "%(function)s(%(expressions)s, '%(search_term)s')"
function = "levenshtein"
def __init__(self, expression, search_term, **extras):
super(Levenshtein, self).__init__(
ExpressionWrapper(Substr(expression, 1, 250), output_field=TextField()),
search_term=search_term,
**extras
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388210.html
標籤:Python sql 姜戈 PostgreSQL的 模糊搜索
上一篇:當我對計數值執行orderby時,查詢需要很長時間才能執行
下一篇:具有隱藏列值的資料框
