Duda con una importación masiva

28 views
Skip to first unread message

Javier Perez

unread,
Mar 7, 2022, 6:53:20 PM3/7/22
to djan...@googlegroups.com
Hola a todos,


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.

Necesito hacer una importación masiva. Estoy siguiendo estaa página web: https://betterprogramming.pub/3-techniques-for-importing-large-csv-files-into-a-django-app-2b6e5e47dba0


Mi archivo es:
#! 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

Francisco Pandol

unread,
Mar 7, 2022, 7:38:15 PM3/7/22
to djan...@googlegroups.com
Hola Javier, lo que pasa es que estás asignando row[0] al campo fondo, no se que tendrá  row[0] pero de seguro no tiene una instancia del modelo Fondos, que es lo que definiste en el modelo de Movimiento. Si row[0] tiene el id del Fondos y los Fondos ya están creados entonces podés asignar movimiento.fondo_id = row[0], 
sino te toca o buscar el Fondo con get, o crearlo antes de asignarlo.

--
--
Ha recibido este mensaje porque está suscrito a Grupo "Grupo de Usuarios del Framework Django de habla hispana" de Grupos de Google.
Si quieres publicar en este grupo, envía un mensaje de correo
electrónico a djan...@googlegroups.com
Para anular la suscripción a este grupo, envíe un mensaje a django-es-...@googlegroups.com
Para obtener más opciones, visita este grupo en http://groups.google.com.bo/group/django-es.
---
Has recibido este mensaje porque estás suscrito al grupo "Django-es" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a django-es+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/django-es/CAKTQcU0FvkJSnm9tapYcmb7F%2Br%2BKKyzurKgQMuCR%3D6GQ4Zeitg%40mail.gmail.com.


--
Francisco Pandol

carlos

unread,
Mar 7, 2022, 8:41:09 PM3/7/22
to djan...@googlegroups.com
Hola, así es lo que dice Francisco, en pocas palabras, tienes que importar primero Fondos ya que los movimientos dependen de Fondos
si no existe un Fondo te dará error.

saludos



--
att.
Carlos Rocha

Carlos Hidalgo

unread,
Mar 8, 2022, 12:33:08 PM3/8/22
to Django-es
Creo que estas asignando este valor "ES0114104039" en un campo donde no debe ir, checa bien la estructura de de cada línea que lees de tu archivo para ver si la estructura encaja bien con cada tipo de datos en:

movimiento = Movimientos(
                    fondo = row[0],
                    aportacion = row[1],
                    participaciones = row[2],
                    fecha


Javier Perez

unread,
Mar 10, 2022, 2:34:20 AM3/10/22
to djan...@googlegroups.com
Gracias a todos.

Sigo con el tema pero es que tengo mucho trabajo y lo tengo un poco parado.



--
Javier Pérez

Javier Perez

unread,
Mar 12, 2022, 11:56:20 AM3/12/22
to djan...@googlegroups.com
Pues al final he "atacado" directamente a la bbdd. Que también me ha cosatado pero por tonto y no fijarme.

Muchas gracias,

--
Javier Pérez

Gabriel Araya Garcia

unread,
Mar 13, 2022, 3:38:45 PM3/13/22
to djan...@googlegroups.com
class Command(BaseCommand): ,.....Command no es una palabra reservada ?,.. o es valida?

Gabriel Araya Garcia
GMI - Desarrollo de Sistemas Informáticos




--
Reply all
Reply to author
Forward
0 new messages