Сравнение между двумя пользовательскими моделями

У меня есть две модели. UsersOne и UsersTwo. Обе эти базы данных выглядят следующим образом:

class UsersOne(models.Model):
    username     = models.CharField(max_length=255, unique=True)
    firstname    = models.CharField(max_length=255, blank=True, null=True)
    lastname     = models.CharField(max_length=255, blank=True, null=True)
    password     = models.CharField(max_length=255)
    email        = models.CharField(max_length=255, blank=True, null=True)

Я пытаюсь найти каждого пользователя с совпадающим email в модели UsersTwo. Так, если есть 10 пользователей в UsersOne и 5 из них имеют совпадающий email UsersTwo, я хочу выписать их в файл csv.

Например, если пользователь John, Doe, ***, jondoe@gmail.com также является пользователем в модели UserTwo, я хочу сделать запрос, чтобы получить его.

Я попробовал это.

import both models...

users_one = UsersOne.objects.all()

matching = []

for i in users_one:
     matching.append(UsersTwo.object.filter(email=users_one[i].email))

И я получаю эту ошибку:

QuerySet indices must be integers or slices, not User.`

Здесь есть две проблемы: i - это не индекс, а объект UserOne, и с помощью .append(…) вы добавляете дубликаты как элемент, а не как элементы списка.

Вы можете решить это с помощью:

matching = []
for user in UsersOne.objects.all()
     matching += UsersTwo.object.filter(email=user.email)

Но это все равно неэффективно: он будет делать запрос для каждого элемента в UsersOne. Вы можете повысить эффективность с помощью:

matching = UsersTwo.objects.filter(email__in=UserOne.objects.values('email'))

или для некоторых баз данных, например , лучше сначала материализовать список values:

matching = UsersTwo.objects.filter(email__in=list(UserOne.objects.values_list('email', flat=True)))
Вернуться на верх