2009-12-24 3 views
4

현재 프로젝트의 일반적인 모델에 date_added 및 date_modified 필드를 추가하고 있습니다. 모델을 서브 클래스 화하고 적절한 필드를 추가하고 있지만 자동화 된 저장 동작을 추가하려고합니다. 예를 들어, 누구든지 MyModel.save()를 호출하면 date_modified 필드가 업데이트됩니다. 두 가지 접근법을 볼 수 있습니다. save() 메서드를 재정의합니다 또는 추상 기본 클래스의 pre_save 신호 처리기를 추가.Django의 여러 모델에 일반적인 date_added, date_modified를 추가하는 가장 좋은 방법

class CommonData(models.Model): 
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False) 
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True) 

    # register a handler for the pre_save to update date_modified 
    def pre_save_handler(sender, **kwargs): 
     date_modified = datetime.datetime.today 

    def __init__(): 
     pre_save.connect(pre_save_handler, sender=self) 

또는

class CommonData(models.Model): 
    date_added = models.DateTimeField(default=datetime.datetime.today,null=False,blank=False) 
    date_modified = models.DateTimeField(default=datetime.datetime.today,null=True,blank=True) 

    # overriding save 
    def save(force_insert=False,force_update=False): 
     date_modified = datetime.datetime.now 
     return models.Model.save(force_insert, force_update) 

내가 장고와 파이썬에 새로 온 사람보다 "장고"하는 방식이었다 궁금하세요? 더 효율적입니다 무엇입니까? 이 작업을 수행하는 "올바른"방법입니까?

답변

4

당신이 장고에 처음으로 광고를 게재 할 때는 유용 장고 명령 확장을 찾을 수 있습니다 편리하게 당신이 당신의 모델을 도출 할 수있는 TimeStampedModel을 포함

http://code.google.com/p/django-command-extensions/

... 에서 :

http://code.google.com/p/django-command-extensions/wiki/ModelExtensions

,

자체 관리 "생성"및 "수정"필드를 제공하는 추상 기본 클래스 모델입니다.

+0

감사합니다 prometheus, 나는 명령 확장을 알지 못했습니다. 나는 python/django를 마음에 듭니다 ... 그러나, 일을하는 많은 방법이 있습니다! – Deano

2

수 있습니다. Abstract Base Class에 이것들을 넣은 다음 그걸 상속하십시오. 모델 필드를 정의하는 MixIn을 갖는 것과 같습니다.

+0

고마워 피터, 그게 내가하고있는 일이야, 내 질문은 기본 기능을 구현하는 가장 좋은 방법에 대한 자세한 내용 : 신호 verus 메서드를 재정의. 나는 신호가 믹스 인 것 같고 메서드 오버라이드가 기본 기능을 가지고있는 것보다 더 낫다고 생각하지 않습니까? – Deano

+0

맞아, 나는 충분한 카페인없이 빨리 움직이고 있었다. Kibitzer의 대답은 죽었다. –

4

DateTimeFieldauto_now=Trueauto_now_add=True을 보셨습니까? 그들은 당신이 필요로하는 것을 자동으로합니다. 그렇지 않으면 세이브 오버라이드와 시그널 핸들링 사이에는 실제적인 차이가 없다. 사실, 장고 모델의 save 메소드에서 pre_save 신호가 호출되고있다.

문서 : http://docs.djangoproject.com/en/dev/ref/models/fields/#datefield

+0

끝내 주셔서 감사합니다 kibitzer! 그래, 내가해야할 것 같아 rtfm'd – Deano

+0

auto_now와 auto_now_add는 현재 신뢰할 수없는 것으로 간주됩니다. save 메소드에서 날짜를 설정하는 것이 더 좋습니다. 이것이 다른 제안 솔루션 (ABC 사용)이 사용하는 것입니다. – hopla

1

auto_now_addauto_now가 작동하지 pre_save를 사용하는 경우 bulk_create 또는 update. 따라서 MySQL에서 date_added 필드는 '0000-00-00 00:00:00'이 될 것이고 경고를받을 수 있습니다 : '경고 :'date_added '열은 null 일 수 없습니다. 따라서 auto_now *를 사용할 수 있지만주의해야합니다.