2010-08-17 7 views
1

Ceci est mon code qui échoue:Django: Comment à la liste 'scrub' des utilisateurs

dashboard = Dashboard.objects.get(slug=slug) 
users = User.objects.all() # list of users 

for editor in dashboard.dashboardeditor_set.iterator: 
    users.remove(editor.user) 

L'erreur: objet 'de instancemethod' est pas itérables

De models.py:

class DashboardEditor(models.Model): 
    dashboard = models.ForeignKey(Dashboard) 
    user = models.ForeignKey(User) 

Quelqu'un peut-il m'aider à comprendre comment nettoyer les éditeurs de la liste de tous les utilisateurs?

Merci! :)

Répondre

2

Je suppose que le message d'erreur que vous manque des parenthèses:

for editor in dashboard.dashboardeditor_set.iterator(): 

En effet, le message d'erreur semble impliquer que iterator est en méthode d'instance de sorte que vous devez appeler pour obtenir l'itérateur réel.

+0

Yikes. Bien sûr. Merci pour cela. :) –

0

Utilisez une combinaison de values_list() et exclude() pour obtenir les résultats en une seule requête (avec un imbriquée SELECT):

dash = Dashboard.objects.get(slug=slug) 
User.objects.exclude(id__in=dash.dashboardeditor_set.values_list('user', flat=True)) 

Génère l'instruction SQL suivante:

SELECT "auth_user"."id", 
     "auth_user"."username", 
     "auth_user"."first_name", 
     "auth_user"."last_name", 
     "auth_user"."email", 
     "auth_user"."password", 
     "auth_user"."is_staff", 
     "auth_user"."is_active", 
     "auth_user"."is_superuser", 
     "auth_user"."last_login", 
     "auth_user"."date_joined" 
FROM "auth_user" 
WHERE NOT ("auth_user"."id" IN 
      (SELECT U0."user_id" 
       FROM "dashboard_dashboardeditor" U0 
       WHERE U0."dashboard_id" = 1)) LIMIT 21 [0.68ms] 

L'utilisation iterator déclenchera environ N + 2 requêtes, où N est le nombre de DashboardEditor s pour le donné Dashboard:

In [24]: users = list(User.objects.all()) 
SELECT "auth_user"."id", 
     "auth_user"."username", 
     "auth_user"."first_name", 
     "auth_user"."last_name", 
     "auth_user"."email", 
     "auth_user"."password", 
     "auth_user"."is_staff", 
     "auth_user"."is_active", 
     "auth_user"."is_superuser", 
     "auth_user"."last_login", 
     "auth_user"."date_joined" 
FROM "auth_user" [0.40ms] 


In [25]: for editor in dash.dashboardeditor_set.iterator(): 
    ....:  users.remove(editor.user) 
    ....: 
SELECT "dashboard_dashboardeditor"."id", 
     "dashboard_dashboardeditor"."user_id", 
     "dashboard_dashboardeditor"."dashboard_id" 
FROM "dashboard_dashboardeditor" 
WHERE "dashboard_dashboardeditor"."dashboard_id" = 1 [0.15ms] 

SELECT "auth_user"."id", 
     "auth_user"."username", 
     "auth_user"."first_name", 
     "auth_user"."last_name", 
     "auth_user"."email", 
     "auth_user"."password", 
     "auth_user"."is_staff", 
     "auth_user"."is_active", 
     "auth_user"."is_superuser", 
     "auth_user"."last_login", 
     "auth_user"."date_joined" 
FROM "auth_user" 
WHERE "auth_user"."id" = 2 [0.25ms] 

SELECT "auth_user"."id", 
     "auth_user"."username", 
     "auth_user"."first_name", 
     "auth_user"."last_name", 
     "auth_user"."email", 
     "auth_user"."password", 
     "auth_user"."is_staff", 
     "auth_user"."is_active", 
     "auth_user"."is_superuser", 
     "auth_user"."last_login", 
     "auth_user"."date_joined" 
FROM "auth_user" 
WHERE "auth_user"."id" = 3 [0.24ms] 

Il y avait deux DashboardEditor dans cet exemple, et l'ORM a exécuté 4 requêtes pour obtenir la liste des utilisateurs non-éditeurs.

Questions connexes