Показать только пользователей, которые еще не существуют в сквозной таблице
Внутри метода __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
тоже, конечно. Я мог бы привести полный код примера, но, увы, нет моделей.