Сравнение между двумя пользовательскими моделями
У меня есть две модели. 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'))
или для некоторых баз данных, например mysql, лучше сначала материализовать список values:
matching = UsersTwo.objects.filter(email__in=list(UserOne.objects.values_list('email', flat=True)))