在项目中,存在一个数据库中具有现有实例的模型。
class Instagram(models.Model):
userid = models.CharField(max_length=255, unique=True)
username = models.CharField(max_length=50, blank=True, null=True)
还有另一种模型,到目前为止没有任何局限性
class InstagramAgesAnalitics(models.Model):
instagram = models.ForeignKey(Instagram)
age = models.CharField(max_length=10)
viewer_percentage = models.DecimalField(default=0, max_digits=5, decimal_places=2)
现在我需要从json文件中存储的值中创建InstagramDemographicsAnalitics模型的新实例。为此,我编写了一个函数,该函数使用for循环并在实例字段中替换所需的键值。
example.json
{
"@nightcrvwlxr": {
"userId": "5697152",
"content_persons_statistic": {
"ages": {
"45-64": 0.016358024691358025,
"18-24": 0.37570950015055704,
"25-34": 0.2789897621198434,
"13-17": 0.2103470340258958,
"35-44": 0.11859567901234568
},
"genders": {
"MALE": 0.6046939714680166,
"FEMALE": 0.39530602853198343
}
}
}
}
views.py
from django.shortcuts import render
import json
from django.http import HttpResponse, HttpResponseRedirect
from .models import InstagramDemographicsAnalitics, Instagram, InstagramAgesAnalitics
def get_ida_instance(request):
with open('/home/jekson/projects/jsontest/example.json', encoding='utf-8') as f:
data = json.loads(f.read())
if request.method == 'POST':
for key, value in data.items():
print(value['userId'])
instagram = Instagram.objects.get(userid=value['userId'])
ages = (value["content_persons_statistic"]['ages'])
for key, value in ages.items():
ida = InstagramAgesAnalitics()
ida.instagram = instagram
ida.age_group = key
ida.viewer_percentage = float(str(value))
ida.save()
print(key + ":" + " " + str(value))
return HttpResponse("Succesful")
return render(request, 'ida.html')
template.html
<form method="post" action="">
{% csrf_token %}
<button type="submit">Click Me!</button>
当我单击СleckMe按钮时,我获得成功,但是数据库中仅出现一个模型实例。但根据这些数据,我希望出现四个:
"45-64": 0.016358024691358025,
"18-24": 0.37570950015055704,
"25-34": 0.2789897621198434,
"13-17": 0.2103470340258958,
"35-44": 0.11859567901234568
如果在 get_ida_instance 中用 print(键+“:” +“” + str(值)) 替换创建实例的代码>功能,然后在控制台中看到我需要的所有值。为什么不创建其余实例?
答案 0 :(得分:3)
您在内部循环中返回,因此它只能执行一次。将返回语句移回两个缩进级别。