2009-09-30 138 views
0

我需要一些清晰的思考如何處理django模型上的保存功能。正如你在下面看到的,我對如何優雅地做這件事感到不知所措。我想將整個對象傳遞給另一個模塊並在那裏分析它。我的動機是分析分析,而不是在models.py中,我會經常改進分析位。謝謝。處理django模型對象的最佳方式是什麼?

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 
+0

羅斯曼先生和米先生的答案都可能是正確的。我最終不是以模型或形式來做,而是在視圖中。 通過硬幣翻轉我給羅斯曼先生的答案。他還提到了關於通告的正確信息。 – user140314 2009-09-30 19:51:41

回答

1

我相信你的錯誤是由一個圓形的進口造成的 - 也就是說,models.py進口spam_analyzer.py,反之亦然,所以Python進入一個混亂。然而,對於您發佈的代碼,您不需要在spam_analyzer中導入SharedLink,因爲您將其作爲參數傳入(儘管請注意,您傳遞的是實例,而不是類本身,因此您應該真的調用參數shared_link爲清楚起見)。

另一種方法是使spam_checker函數成爲SharedLink類的一個方法,因此您可以在save()方法中調用self.spam_checker()

0

在表單圖層檢查它。當你第一次看到sharedLink時,你可以從你的表單中的clean()例程調用spam_checker;然後將該標誌傳遞給具有該鏈接的模型。

但是,如果您的垃圾郵件檢測器持續改進,可能會更好,請在模型上將spamchecker作爲flag()方法實施。因此該標誌將始終使用最新的spam_checking算法。

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

    @property 
    def flag(self): 
     return spam_check(self.link) 
相關問題