Как я могу удалить дублированных пользователей в Django? - PullRequest
3 голосов
/ 27 апреля 2010

Мне нужно удалить дублированных пользователей в django (под дубликатом я имею в виду двух или более пользователей с одним и тем же адресом электронной почты).

Если, например, есть три записи, подобные этой:

id    email
3     c@c.com
56    c@c.com
90    c@c.com

Мне нужно удалить записи 56 и 90 и оставить идентификатор самой старой записи -> 3

Есть ли способ быстро сделать это.

Спасибо:)

Ответы [ 3 ]

3 голосов
/ 27 апреля 2010

RZs ответ на самом деле почти правильный. Я не знаю, лучший ли это способ, но он работает. Так что для этой единственной цели вы можете использовать его.

Однако я хотел бы добавить и исправить некоторые вещи.

from django.contrib.auth.models import User

def delete_duplicate_users():
  // first find all email addresses (with kind of a 'group by')
  emails = User.objects.values('email').distinct()

  for e in emails:
    users = User.objects.filter(email=e['email']).order_by('date_joined')[1:]
    for u in users:
      u.delete()

Я попробовал это на небольшом примере, и это сработало. Но я настоятельно рекомендую вам проверить это до того, как вы действительно используете его в своей производственной системе!

Надеюсь, это поможет вам.

// Редактировать

Я бы также рекомендовал вам не разрешать добавлять пользователей, если электронная почта уже зарегистрирована. Должен быть какой-то встроенный метод для достижения этой цели. А если нет, то вы можете создать подкласс модели Djangos User с вашей собственной моделью User и переопределить метод сохранения.

1 голос
/ 27 апреля 2010
users = User.objects.filter(email='c@c.com').order_by('join_date')[1:]
for u in users:
    u.delete()

Я забыл, поддерживает ли наборы запросов нарезку, как описано выше, и не может сейчас тестировать. Если это не так, вам просто нужно извлечь первый элемент и удалить остальные.

0 голосов
/ 19 ноября 2014

Вы можете получить адреса электронной почты, подобные этим.

from django.contrib.auth.models import User
from django.db.models import Count

duplicate_emails = [i['email'] for i in User.objects.values('email').annotate(
    Count('email')).filter(email__count__gt=1)]

Затем вы можете просмотреть адреса электронной почты и решить, что с ними делать. В этом примере удаляется пользователь с более старой датой last_login.

for email in duplicate_emails:
    user = User.objects.filter(email=email).order_by('last_login')[0]
    user.delete()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...