Django: как «вычистить» список пользователей - PullRequest
1 голос
/ 17 августа 2010

Это мой код, который не работает:

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

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

Ошибка: объект instancemethod не повторяется

от models.py:

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

Кто-нибудь может мне помочь разобраться, как вычистить редакторов из списка всех пользователей?

Спасибо! :)

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Я думаю, из сообщения об ошибке, что вы пропустите скобки:

 for editor in dashboard.dashboardeditor_set.iterator():

Это связано с тем, что сообщение об ошибке подразумевает, что iterator является экземпляром метода, поэтому вам нужно вызвать его, чтобы получить реальный итератор.

0 голосов
/ 30 июля 2012

Используйте комбинацию values_list() и exclude() для получения результатов в одном запросе (с вложенным SELECT):

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

Создает следующий SQL:

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]

Использование iterator вызовет примерно N + 2 запроса, где N - число DashboardEditor с для данного 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]

Было два DashboardEditor сэтот пример, и ORM выполнил 4 запроса, чтобы получить итоговый список пользователей без редактирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...