2014-10-11 83 views
2

我正在研究一個Djnago項目,並想知道我是否可以使用我使用Urllib2解析的信息快速自動填充大量數據的域。這裏是我的模型Django:使用Urllib2自動填充CharField

from django.db import models 

class Stocks(models.Model): 
    Ticker = models.CharField(max_length=250) 
    Name = models.CharField(max_length=250) 
    Exchange = models.CharField(max_length=250) 
    Industry = models.CharField(max_length=250) 
    About = models.TextField() 

    class Meta: 
     verbose_name_plural = "Stocks" 

    def __unicode__(self): 
     return self.Ticker 

到目前爲止,我已經做到了這一點利用從CSV數據填充字段,「北京時間」,「姓名」和「交流」,像這樣(uisng「蟒蛇manage.py殼「):

import csv 
from stocks.models import Stocks 
fields = ["Ticker", "Name", "Exchange"] 
for row in csv.reader(open('NASDAQ.csv', 'rU'), dialect='excel'): 
    Stocks.objects.create(**dict(zip(fields, row))) 

我在想,如果我可以自動填充‘行業’字段相同的方法從拉的urllib2數據。這裏是我的relevany的urllib2代碼:

indusCode = urllib2.urlopen("http://finance.yahoo.com/q/in?s="+t).read() 
industry = indusCode.split('<b>Industry: ')[1].split('</b>')[0] 
industry = industry.replace("&amp;", "&") 

任何人都知道,如果我可以使用從urllib2的拉填充「行業」字段中的數據?謝謝

回答

2

當然。

import csv 
from stocks.models import Stocks 
fields = ["Ticker", "Name", "Exchange"] 
for row in csv.reader(open('NASDAQ.csv', 'rU'), dialect='excel'): 
    row_dict = dict(zip(fields, row)) 
    indusCode = urllib2.urlopen("http://finance.yahoo.com/q/in?s=" + row_dict['Ticker']).read() 
    industry = indusCode.split('<b>Industry: ')[1].split('</b>')[0] 
    industry = industry.replace("&amp;", "&") 
    row_dict['Industry'] = industry 
    Stocks.objects.create(**row_dict) 

未測試。但我相信類似的東西應該有效。

+0

謝謝你,這工作像一個魅力。但是,當我運行它時,代碼將創建一個新的代碼並將行業名稱添加到新的代碼中,而不是將代碼添加到我之前創建的現有代碼中。任何方式來解決這個問題? – ng150716 2014-10-11 01:09:53

+0

那麼,你正在調用create。如果股票代碼已經作爲'Stocks'對象存在,那麼您首先需要獲取該對象,然後更新這些值。就像'如果Stocks.objects.filter(Ticker = row_dict ['Ticker'])。exists():'然後你創建一個引用對象,並只是分配的方式。如果那個'if'失敗了,那麼你可以把所有先前發佈的代碼放在'else:'塊中。獎金,對於現有的'股票'對象,您不需要更新行業。 – 2014-10-11 02:11:04

+0

好吧,我已經對我的代碼進行了一些編輯,但是當我運行它時,似乎沒有發生任何事情。你可以看到我的代碼[在這裏](http://pastebin.com/GkVFaDgG) – ng150716 2014-10-11 20:44:28