Как заполнить модель с помощью имеющейся модели 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,)