代码之家  ›  专栏  ›  技术社区  ›  NeoVe

将结果JSON保存到sqlite-django中

  •  0
  • NeoVe  · 技术社区  · 6 年前

    我有这个代码:

    def getExchangeRates():
        """ Here we have the function that will retrieve the latest rates from fixer.io """
        rates = []
        response = urlopen('http://data.fixer.io/api/latest?access_key=c2f5070ad78b0748111281f6475c0bdd')
        data = response.read()
        rdata = json.loads(data.decode(), parse_float=float) 
        rates_from_rdata = rdata.get('rates', {})
        for rate_symbol in ['USD', 'GBP', 'HKD', 'AUD', 'JPY', 'SEK', 'NOK']:
            try:
                rates.append(rates_from_rdata[rate_symbol])
            except KeyError:
                logging.warning('rate for {} not found in rdata'.format(rate_symbol)) 
                pass
    
        return rates
    
    @require_http_methods(['GET', 'POST'])
    def index(request):
        rates = getExchangeRates()   
        return render(request, 'index.html') 
    

    结果 json data.fixer.io 有一种格式,比如, currency | rate_of_the_currency .

    像这样: "rates": {"SAR": 4.394498, "INR": 49.836962, and so on... ,所以,我在Django上创建了这个模型:

    class Fixerio_rates(models.Model):
        currency = models.CharField(max_length=128)
        rate = models.FloatField()
    

    现在,如何将代码中的结果保存到这个模型中?已经进行了迁移,这不应该是一件复杂的事情,但因为这是从 Flask 进入之内 Django 它让我有点困惑。这是一种不同的方法,Django有自己的方法来处理这些事情。

    有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Alex C    6 年前

    詹戈 bulk_create queryset方法,它在一个数据库查询中添加多个记录(高效的方法)。所以您的代码应该如下所示:

    首先重写函数getexchangerates,这样就可以为所有货币获取一个dict,而不是为每个货币获取dict列表。

    rates = {}
    ...
    for rate_symbol in ['USD', 'GBP', 'HKD', 'AUD', 'JPY', 'SEK', 'NOK']:
        try:
            rates[rate_symbol] = rates_from_rdata[rate_symbol]
        except KeyError:
            logging.warning('rate for {} not found in rdata'.format(rate_symbol)) 
            pass
    
    return rates
    

    然后迭代dict,创建模型实例,然后批量保存。

    rates = getExchangeRates()
    fixerio_rates = [Fixerio_rates(currency=currency, rate=rate)
                     for currency, rate in rates.items()]
    Fixerio_rates.objects.bulk_create(fixerio_rates)