Skip to content

Instantly share code, notes, and snippets.

@rg3915
Last active December 15, 2021 18:49
Show Gist options
  • Save rg3915/69a4d5526d83ba10cf6ee76ff8af7c23 to your computer and use it in GitHub Desktop.
Save rg3915/69a4d5526d83ba10cf6ee76ff8af7c23 to your computer and use it in GitHub Desktop.
Exemplo de uso do bulk_create no Django. Incluindo escrita e leitura de CSV.

Exemplo de uso do bulk_create no Django

Projeto Django

pip install django names

Crie um projeto Django e gere a migração. Usaremos somente o model User.

Criando um CSV com nomes de pessoas

Usaremos a lib names. Portanto, os dados são fictícios.

import csv
import names

# Gerando um CSV
with open('/tmp/names.csv', 'w') as f:
    csv_writer = csv.writer(f)
    csv_writer.writerow(('first_name', 'last_name', 'username', 'email'))
    for _ in range(100):
        first_name = names.get_first_name()
        last_name = names.get_last_name()
        username = '{}-{}'.format(first_name.lower(), last_name.lower())
        email = '{}.{}@email.com'.format(first_name.lower(), last_name.lower())
        csv_writer.writerow((first_name, last_name, username, email))

Lendo o CSV

import csv
user_list = []
with open('/tmp/names.csv') as f:
    reader = csv.DictReader(f)
    for row in reader:
        user_list.append(row)

Usando o bulk_create

from django.contrib.auth.models import User
# Não parece, mas é uma list comprehension
# O importante é que precisa declarar o objeto User.
users = [User(
    first_name=user['first_name'],
    last_name=user['last_name'],
    username=user['username'],
    email=user['email']
) for user in user_list]
# Aqui entra o bulk_create. Ele é muito rápido
User.objects.bulk_create(users)

Leia sobre como ler CSV com Pandas.

Atenção: se sua lista tiver username duplicados vai dar erro, então sugiro que leia esse trecho de código usando Pandas:

# Removendo os itens duplicados
dffinal = df.drop_duplicates('EMAIL').reset_index()
dffinal.tail()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment