@tarp20

Как оптимизировать данный скрипт и уменьшить количество запросов в базу данных?

есть две модели :
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)


оптимальное ли здесь количество запросов в БД и вообще как можно улучшить данный код?
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы