Показать только пользователей, которые еще не существуют в сквозной таблице

Внутри метода __init__ формы ProjectUserCreateForm(forms.ModelForm) для добавления пользователей в проект (модель проекта имеет users = models.ManyToManyField(...)) у меня есть

self.fields['users'].queryset = User.objects.filter(company=self.request.user.company)

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

Эту форму можно найти в

path('<int:pk>/users/create/', views.ProjectUserCreateView.as_view(), name='project-user-create'),

где <int:pk> - это PK проекта, а ProjectUserCreateView - это CBV CreateView.

Как я могу показать только тех пользователей, которые принадлежат к компании вошедшего пользователя (эта часть уже работает) И которые еще не существуют в сквозной таблице (таблица на основе поля ManyToManyField)?

Вы можете получить всех пользователей, которые еще не принадлежат к компании пользователя request.user с помощью:

users_in_company = request.user.company.user_set.all().values(pk).distinct()
users_not_in_company = User.objects.all().exclude(pk__in=list(users_in_company))

Бонус: Если вы хотите получить всех пользователей, которые не принадлежат к любой компании:

users_not_in_any_company = users_not_in_company.filter(company__isnull=True) # Equal to User.objects.filter(company__isnull=True), but it doesn't really matter.

Примечание:

request.user.company.user_set.all()

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

Вернуться на верх