Estoy empezando con django y en un proyecto personal tengo que hacer una importación masiva.
Estoy realizando una aplicación que me gestione unos fondos de inversión. La app tiene dos modelos: los fondos y los movimientos.
#! ejecución:
# python3 manage.py load_csv datos_importacion/movimientos.csv
import csv
from django.core.management import BaseCommand
from fondos.models import Movimientos
class Command(BaseCommand):
help = "Carga los movimientos del CVS"
def add_arguments(self, parser):
parser.add_argument("file_path", type=str)
def handle(self, *args, **options):
file_path = options["file_path"]
with open(file_path, "r") as csv_file:
data = csv.reader(csv_file, delimiter=";")
movimiento = []
for row in data:
print(row[0])
movimiento = Movimientos(
fondo = row[0],
aportacion = row[1],
participaciones = row[2],
fecha = row[3]
)
movimiento.append(movimiento)
if len(movimiento) > 5000:
Movimientos.objects.bulk_create(movimiento)
movimiento = []
if movimiento:
Movimientos.objects.bulk_create(movimiento)
Este es el error que da:
ValueError: Cannot assign "'ES0114104039'": "Movimientos.fondo" must be a "Fondos" instance.
¿como se puede solucionar?
Y los modelos son estos:
class Fondos(models.Model):
ENTIDAD_CHOICES = (
('0', 'banco1'),
('1', 'banco2'),
('2', 'banco3'),
)
MONEDA_CHOICES = (
('0', 'Euro'),
('1', 'Dolar'),
('2', 'Franco Suizo'),
)
PROPIETARIO_CHOICES = (
('0', 'Ambos'),
('1', '1'),
('2', 'Seguimiento'),
)
isin = models.CharField(
max_length=12, unique=True, blank=True, null=True
)
nombre = models.CharField(
max_length=50, blank=True, null=True
)
entidad = models.CharField(
max_length=1, choices=ENTIDAD_CHOICES
)
moneda = models.CharField(
max_length=1, choices=MONEDA_CHOICES
)
propietario = models.CharField(
max_length=1, choices=PROPIETARIO_CHOICES, default='0', blank=True, null=True
)
aportacion_periodica = models.BooleanField(
default=False, blank=True, null=True)
chequeo_estado = models.BooleanField(
default=False, blank=True, null=True)
url = models.URLField(
max_length=100, blank=True, null=True
)
suma_aportaciones = models.DecimalField(
#todo: valor calculado, hacer que sea suma de Movimientos y ese ISIN
decimal_places=2, max_digits=8, blank=True, null=True
)
class Meta:
verbose_name = ("Fondo")
verbose_name_plural = ("Fondos")
def __str__(self):
return self.nombre + ' - ' + str(self.isin[-4:])
class Movimientos(models.Model):
fondo = models.ForeignKey(
'Fondos',
on_delete=models.CASCADE)
fecha = models.DateField()
participaciones = models.DecimalField(
max_digits=6,
decimal_places=2
)
aportacion = models.DecimalField(
verbose_name='Aportación en moneda local',
max_digits=6,
decimal_places=2
#todo: cambiar a MoneyField
)
chequeo_iconta = models.BooleanField(default=False)
chequeo_banco = models.BooleanField(default=False)
class Meta:
verbose_name = ("Movimiento")
verbose_name_plural = ("Movimientos")
def __str__(self):
return str(self.fondo)
--
Javier Pérez