2010-11-30 2 views
0

나는 REST 서비스를 ping하고 결과를 저장하는 모델을 가지고있다. 은 "스토어"개체 내 의견의 대부분에 있기 때문에이 모델을 만드는 더 좋은 방법이 있습니까? (Django)

class StoreStatus(models.Model): 
    store = models.OneToOneField(Store) 
    status = models.TextField() 

    def save(self, *args, **kwargs): 
     self.status = get_store_information(self.store.code) 
     self.pk = self.store.pk  
     super(StoreStatus, self).save(*args, **kwargs) 

는 내가보기에)을 반복적으로 매일을 실행하고 그림 난 그냥 (.save 수 있어야합니다.

더 좋은 방법이 있나요? 나는 두 번째 시간을 저장하려고 할 때 중복 오류가 발생했기 때문에 수동으로 pk를 설정해야했습니다.

더러운 것 같고 코딩을 개선하려고합니다. 감사합니다.

+0

이 모델을 'Store' 모델과 병합 할 수없는 이유가 있을까요? – SingleNegationElimination

답변

1

상당히 나빠 보이네요.

먼저 상태 정보 검색과 개체 저장을 연관시키는 것은 좋은 생각이 아닙니다. 이 모델에서 수행 할 수있는 유일한 동작이 '업데이트'인 경우 더 나은 방법은 상태를 업데이트 한 후에 자동으로 저장하는 "update()"메서드를 작성하는 것입니다. 약.

def update(self): 
    self.status = get_store_information(self.store.code) 
    self.save() 

둘째 :이 모델의 첫 번째 인스턴스는 어떻게 작성하고 있습니까? 모델이 업데이트 될 때마다 새 인스턴스를 저장하려고하면 복제 오류가 발생합니다. 당신이, 당신이 할 수있는만큼 게으른 경우

# always retrieve the stored instance before saving  
status, created = StoreStatus.objects.get_or_create(store=mystore) 
status.update() 

:

# this will work (provided we have 'update') 
mystore.status.update() 

또는 :

# this will crap out 
update = Update(mystore) 
update.save() 

당신이 일을해야하는 것은 같은 것이있다 : 당신이 뭔가를 할 경우, 말 Store 모델에 항상 "update_status"메소드를 추가하고 거기에서 생성/업데이트를 수행하십시오. 자신이하는 일에 대해 명시하는 것이 항상 좋습니다. 기억 : Django는 최소한의 놀라움의 원칙을 기반으로하므로 코드를 사용해야합니다! 응답을 수신에
2. REST 호출을 확인
1. 매개 변수로 저장소 개체를 그대로 사용하고,
3 : 내가 당신이라면 :

1

, 난 것 기능을 만든 것 그런 다음 StoreStatus에서 상태를 갱신하십시오.

웹 기반 서비스와 관련된 아키텍처에 필요한 느슨한 연결을 가능하게하는 것이 바람직합니다.

또한 PK 오류가 중복되는 것을 방지하려면 ID를 확인하여 안전하게 업데이트를 반복하고 조건을 만들 수 있습니다.

def save(self, *args, **kwargs): 
    if self.id: 
     # Update case 
     pass 
    else: 
     # New object 
     # Process for the new object 
     pass 

    # Save the changes 
    super(StoreStatus, self).save(*args, **kwargs) 
관련 문제