Setattr не сохраняет значения моего класса в сценарии Python
Я работаю над проектом, который должен сохранить в базе данных значения, предоставленные в json.
Функция setattr
не работает, когда я пытаюсь сохранить значения каждого json-концепта в базе данных.
Я думаю, что я правильно указал атрибуты функции.
Это мой models.py
:
class Balance_sheet(models.Model):
company_name = models.CharField(max_length=140)
year = models.CharField(max_length=140)
quarter = models.CharField(max_length=140)
CashAndCashEquivalentsAtCarryingValue = models.IntegerField(null=True, blank=True)
... #Extra fields
class Meta:
ordering = ['year']
verbose_name = "Balance Sheet"
verbose_name_plural = "Balance Sheets"
def get_attribute_by_name(self, field):
if hasattr(self,field):
return getattr(self,field)
else:
return ''
def set_attribute_by_name(self, field, value):
if hasattr(self, field):
return setattr(self, field, value)
else:
return ''
def __str__(self):
return "%s %s" % (self.company_name, self.year)
Это мой script.py
:
from types import SimpleNamespace
from typing import AsyncGenerator
from django.core.management.base import BaseCommand, CommandError
from database.models import Balance_sheet
class Command(BaseCommand):
def handle(self, *args, **options):
# importing data from json
data = open('database/static/data/data-q1.json')
jsonObjectQ1 = json.load(data)
json_prettyQ1 = json.dumps(jsonObjectQ1, sort_keys=True, indent=4)
data.close()
x = json.loads(json_prettyQ1, object_hook=lambda d: SimpleNamespace(**d))
print(x.startDate, x.companyName, x.companyCIK)
print(x.year)
# Creating Objects
balance_sheet = Balance_sheet.objects.create(company_name=x.companyName, year=x.year, quarter=x.quarter)
#Reading data
for data in x.data.bs:
concept = data.concept
value = data.value
fields = Balance_sheet._meta.get_fields()
for field in fields: #checking if field exists
if concept == field.name:
model_name = field.name
setattr(balance_sheet, model_name, value) #problem
balance_sheet.save
Я тоже пробовал со следующим кодом, поэтому его def
включили в models.py
:
for field in fields:
if concept == field.name:
model_name = field.name
balance_sheet.set_attribute_by_name(model_name, value)
balance_sheet.save
print(" FILE SAVED")