Как заполнить модель с помощью имеющейся модели django?

У меня есть модель People:

с name, phone email, address полями

используя команды управления Django, я хочу заполнить Contact модель теми же полями

командный файл: from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = 'Sorting leads '

    def handle(self, *args, **kwargs):
        pass

1.Несколько людей с одним и тем же именем и номером телефона должны быть объединены вместе, так что результирующий Контакт содержит все электронные письма и адреса из объединенных лидов. 2. Несколько людей с одинаковыми именами, но разными номерами телефонов и электронной почты должны быть сохранены как отдельные контакты

Как я должен это сделать? Должен ли я делать это с помощью raw sql или есть лучшее решение.

Я не думаю, что вам нужно переходить на raw sql. Судя по вашему описанию, вы можете сделать это довольно легко в рамках ORM

#get everyone, and mark them as unprocessed
qs = People.objects.all().annotate(processed=False)

for person in qs:
    #is there someone with the same name and phonenumber?
    person_num = People.objects.filter(name=person.name, phone=person.phone, processed=False).count()
    #No, they are unique, so make a contact
    if person_num == 1:
        Contact.objects.create(name = person.name, 
            phone = person.phone,
            email = person.email,
            address = person.address)
    #Yes, there is more than one, set up some lists to capture data
    elif person_num > 1:
       phone_list = []
       email_list = []
       address_list = []
       #Get all the people with same name and phone number and gather their details
       same_name_group = People.objects.filter(name=person.name, phone=person.phone, person.processed = False)
       #cehck list before adding to avoid duplicate phones etc
       for same_name_person in same_name_group:
           if same_name_person.phone not in phone_list:
               phone_list.append(same_name_person.phone)
           if same_name_person.email not in email_list:
               phone_list.append(same_name_person.email)
           if same_name_person.address not in address_list:
               phone_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
       Contact.objects.create(name = person.name,
           #stringify our lists with a ; seperator
           phone = ';'.join(str(x) for x in phone_list,
           email = ';'.join(str(x) for x in email_list,
           address = ';'.join(str(x) for x in address_list,)

           
Вернуться на верх