0

django モデルで保存機能を処理する方法について、明確な考え方が必要です。以下に示すように、これをエレガントに行う方法に途方に暮れています。オブジェクト全体を別のモジュールに渡して、そこで分析したいと思います。models.py ではなく分割した分析を行う動機は、分析ビットを頻繁に改良することです。ありがとう。

models.py
from test_app.spam_analyzer import spam_checker
class SharedLink(models.Model):
    link = models.URLField()
    submitters_ip = models.IPAddressField()
    flag = models.CharField()
    def save(self, *args, **kwargs):
        self.flag = spam_checker(self)
        super(SharedLink, self).save(*args, **kwargs)

spam_analyzer.py
from test_app.models import SharedLink #this causes a "field not found" error
def spam_checker(SharedLink)
    submitters_ip = SharedLink.submitters_ip
    # see if this user's ip appears on a spam list
    # if it does flag it 'spam'
    return flag
4

2 に答える 2

1

あなたのエラーは循環インポート、つまりmodels.pyimports spam_analyzer.py、またはその逆が原因であると思われるため、Pythonは混乱します。ただし、投稿したコードでは、パラメーターとして渡すため、インポートする必要はありませんSharedLink(spam_analyzerただし、クラス自体ではなくインスタンスを渡すことに注意してください。そのため、パラメーターを実際に呼び出す必要があります) shared_link。明快さの)。

spam_checkerの方法として、関数を SharedLink クラスのメソッドにすることself.spam_checker()で、save() メソッドを呼び出すだけで済みます。

于 2009-09-30T07:43:53.297 に答える
0

フォームレイヤーで確認してください。sharedLink を最初に見つけたときに、フォームの clean() ルーチンから spam_checker を呼び出すことができます。次に、リンクを使用してフラグをモデルに渡します。

ただし、spamchecker が常に改善されていることを考えると、spamchecker をモデルの flag() メソッドとして実装する方がよいでしょう。したがって、フラグは常に最新の spam_checking アルゴリズムを使用します。

class SharedLink(models.Model):
    link = models.URLField()

    @property
    def flag(self):
        return spam_check(self.link)
于 2009-09-30T12:44:43.833 に答える