есть две модели :
Leads
и
Contact
c одинаковыми полями
name,phone,email,address
есть скрипт который мигрирует данные :
по принципу :
1. Несколько Лидов с одинаковым именем и номером телефона должны быть объединены вместе, чтобы в результате контакт содержал все электронные письма и адреса из объединенных лидов.
2. Несколько потенциальных клиентов с одинаковым именем, но разными номерами телефонов и электронной почтой должны быть сохранены как отдельные контакты.
мой скрипт :
def handle(self, *args, **kwargs):
# get everyone, and mark them apips unprocessed
qs = Lead.objects.all().annotate(
processed=Value(False, output_field=BooleanField()))
# all_leads
all_data = qs.count()
# same name and phone
count_dup = 0
for lead in qs:
nes_lead = qs.filter(name=lead.name, email=lead.email).exclude(
phone=lead.phone).count()
if nes_lead > 0:
csv_data.append(dict(name=lead.name,
phone=lead.phone,
email=lead.email,
address=lead.address))
continue
# is there someone with the same name and phonenumber?
lead_num = qs.filter(
name=lead.name, phone=lead.phone, processed=False).count()
# person_num = qs.filter(
# name=person.name, phone=person.phone, processed=False).count()
# No, they are unique, so make a contact
if lead_num == 1:
data = dict(name=lead.name,
phone=lead.phone,
email=lead.email,
address=lead.address)
if Contact.objects.filter(**data).exists():
continue
else:
Contact.objects.create(**data)
# Yes, there is more than one, set up some lists to capture data
elif lead_num > 1:
count_dup += 1
email_list = []
address_list = []
# Get all the people with same name and phone number and gather their details
same_name_group = qs.filter(
name=lead.name, phone=lead.phone, processed=False)
# cehck list before adding to avoid duplicate phones etc
for same_name_person in same_name_group:
if same_name_person.email not in email_list:
email_list.append(same_name_person.email)
if same_name_person.address not in address_list:
address_list.append(same_name_person.address)
# we've dealt with this person so we don't need to look at them again
same_name_person.processed = True
data = dict(name=lead.name, phone=lead.phone,
email=';'.join(str(x)for x in email_list),
address=';'.join(str(x) for x in address_list),)
if Contact.objects.filter(**data).exists():
continue
else:
Contact.objects.create(**data)
оптимальное ли здесь количество запросов в БД и вообще как можно улучшить данный код?