2010-04-27 7 views

Répondre

2

La réponse RZ est en réalité presque correcte. Je ne sais pas si c'est la meilleure façon, mais ça marche. Donc, pour ce but une fois, vous pouvez l'utiliser.

Cependant, je voudrais ajouter et corriger certaines choses.

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() 

J'ai essayé ceci avec un petit exemple et cela a fonctionné. Mais je vous recommande fortement de tester ceci avant de l'utiliser sur votre système de production!

Espérons que cela vous aide.

// Modifier

Je recommande également que vous ne permettez pas à l'ajout d'utilisateurs si l'email est déjà enregistré. Il devrait y avoir une méthode intégrée pour y parvenir. Et sinon, vous pouvez sous-classer le modèle utilisateur Djangos avec votre propre modèle utilisateur et remplacer la méthode de sauvegarde.

+0

Merci, cela a parfaitement fonctionné. Il y avait juste une chose que je devais changer. La ligne 5 devrait être emails = User.objects.values ​​('email'). Distinct() au lieu de emails = Users.objects.values ​​('email'). Distinct() – Catalina

+0

Merci. J'ai corrigé la faute de frappe. – Jens

1
users = User.objects.filter(email='[email protected]').order_by('join_date')[1:] 
for u in users: 
    u.delete() 

J'oublie si QuerySets prend en charge le tranchage comme ci-dessus et ne peut pas tester en ce moment. Si ce n'est pas le cas, vous devez simplement extraire le premier élément et supprimer le reste.

+0

Oui, vous ne pouvez pas utiliser d'index négatifs. –

0

Vous pouvez obtenir les adresses emailes de ce type.

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)] 

Ensuite, vous pouvez parcourir les adresses e-mail et décider quoi en faire. Cet exemple supprime l'utilisateur avec une date last_login plus ancienne.

for email in duplicate_emails: 
    user = User.objects.filter(email=email).order_by('last_login')[0] 
    user.delete() 
Questions connexes