2009-09-30 4 views
0

장고 모델에서 저장 함수를 처리하는 방법에 대한 명확한 생각이 필요합니다. 아래에서 볼 수 있듯이 나는 이것을 우아하게하는 방법을 놓치고 있습니다. 전체 객체를 다른 모듈로 전달하고 거기에서 분석하고 싶습니다. 분석을 시작한 동기는 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 
+0

로즈 맨 씨와 미씨의 대답은 모두 정확할 것입니다. 나는 그것을 모델이나 형식이 아니라보기에서하는 것으로 끝 맺었습니다. 동전 던지기로 Roseman에게 답변을드립니다. 그는 또한 순환 수입에 관한 정확한 정보를 언급했다. – user140314

답변

1

나는 당신의 오류가 원형의 수입으로 인해 발생 추정 - 즉, models.py 수입 spam_analyzer.py, 반대, 파이썬은 혼란에 얻을 수 있도록. 그러나 게시 한 코드를 사용하면 에 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) 
관련 문제