2012-11-16 3 views
0

재고 추적 애플리케이션을 구축 중이며 매주 재고 가격을 현재 가격으로 자동 업데이트해야합니다 (Google Finance에서 가져옴). 수천 개의 레코드가 있고 현재의 방법이 매우 느리고 비효율적이기 때문에보다 효율적인 방법으로이를 수행하는 방법을 알아야합니다.매분 자동으로 모델을 업데이트 하시겠습니까?

#models.py 


class Stock(models.Model): 
    ticker = models.CharField(max_length=200) 
    current_price = models.DecimalField(max_digits=20, decimal_places=5) 

아래 스크립트는 crontab을 통해 매 순간

#script set to run on a crontab 
from takestock.stock_getter import get_quotes 
from takestock.models import Stock 


class Command(BaseCommand): 
    help = 'Gathers current stock prices from Google Finance using stock_getter script (imported) and updates all stocks in the database to reflect the current stock price.' 

def get_stock_dict(self): 
    all_stocks = Stock.objects.all() 
    stock_names = [] 

    for single_stock in all_stocks: 
     stock_names.append(str(single_stock.ticker)) 

    stock_values = get_quotes(stock_names) #a list of values which corresponds to the list of names 
    stock_dict = dict(zip(stock_names, stock_values)) #stock tickers and stock values zipped into dict (see below) 

    return stock_dict 
     #stock_dict looks like: {'GOOG': '73.84', 'AAPL': '520.34'} 

def handle(self, *args, **options): 

    stock_dict = self.get_stock_dict() 
    for ticker, value in stock_dict.items(): 
     stock_obj = Stock.objects.get(ticker=ticker) 
     stock_obj.current_price = value 
     stock_obj.save() 

이 방법은 작업을 실행하지만, 아주 천천히 그리고 나는 그것이 매우 데이터베이스를 많이 상상한다. 이 일을 더 잘 수행 할 수있는 방법이 있습니까? 감사.

답변

3

사용 update는 대신 GET의/일상 저장 : 당신의 시세가 변경되지 않습니다 특히

Stock.objects.filter(ticker=ticker).update(current_price=value) 

은, 모든 시세마다 시간을 가져 오지 마십시오. 한 번 가져와 빠른 k/v 상점에 캐시하십시오. 그러나 그들을 가져와야한다면 only을 사용하여 에만 가격뿐만 아니라 시세 기호를 가져 오십시오.

Google에서 가장 느린 부분은 가져 오는 것입니다. 이 코드를 게시하지 않았기 때문에 다른 팁을 제공하기가 어렵습니다.

+0

"매시간마다 시세표를 가져 오지 마십시오. 특히 시세표가 변경되지 않으면 신속하게 가져 오지 마십시오. 한 번 가져 와서 빠른 k/v 상점에 캐시하십시오. 그러나 가져 오기를해야하는 경우에만 시세표 기호가 아니라 가격뿐만 아니라. " 어떻게 생겼는지 예를 들어 주시겠습니까? 감사합니다. 그리고 가장 많은 시간을 들여서 가져온 것이 틀림 없습니다. 그러나 데이터베이스 호출을 처리하는 더 나은 방법이 있다고 생각했습니다. – Jackson

+0

두 번째 부분은 무엇입니까? –

+1

@ Burhan이 제안한 것이 더 우아한 방법입니다. 코드에서, 먼저 get을 통해 객체를 가져 와서 그것을 갱신 한 다음, save를 통해 변경 사항을 저장합니다. 'update'는 한 단계에서 그렇게합니다. – miki725

관련 문제