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

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Столкнулся с такой проблемой. У меня есть три таблицы: в одной находятся электронные адреса, в другой имя пользователя — эти две таблицы я объединяю в модели
Листинг программы
  1. class Customer(models.Model):
  2. user = models.ForeignKey(User, unique=True, verbose_name=u'пользователь')#, blank=True, null=True)
В третьей таблице хранятся электронные адреса и имена пользователей, которые заказчик сам добавляет через форму. Задача - объединить данные всех таблиц так, чтобы электронный адрес каждой записи был уникальным в этой выборке. Пытался использовать itertools.chain.from_iterable, но он годится только для одного списка объектов. Делал так
Листинг программы
  1. Customers = list(chain(Customer.objects.all(), SMail.objects.distinct()))
Работает, но так уникальными являются электронные адреса в каждой выборке из таблиц по отдельности. Такая организация не моя заслуга, делали до меня. Добавлять данные в первые 2 таблицы нельзя, т.к. это реальные пользователи, а в третьей таблицы только имена и почты тех, кому заказчик желает отправить рассылку дополнительно. Заранее спасибо, если чего-то не хватает - дополню

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

textual
Листинг программы
  1. # список словарей.
  2. emails1 = Customer.objects.all().distinct('user__email').values('user__email', 'user__username)
  3. # список емайлов
  4. ex_email = [row['user__email'] for row in emails1]
  5. # список словарей.
  6. emails2 = SMail.objects.filter(~Q(email__in=ex_email)).distinct('email').values('email', 'user')
  7. Customers = emails1.update(emails2)
  8. print Customers

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы