Хотите выполнить левое соединение в django
Скажем, у меня 2 модели
Model Users:
Name:
Id:
И посещаемость
Model Attendance:
user: foreign_key(User)
present: [present if login else nothing recorded]
Date:
users = User.objects.all()
todays_present = Attendance.objects.filter(date=today)
Теперь, например, Users = 10 todays_present = 7
Я хочу найти, каких трех пользователей нет в todays_present.
3 ответа
Вы можете работать с
.exclude(…)
[Django-doc] с:
User.objects.exclude(attendance__date=today)
Это приведет к получению всех пользователей, для которых нет
Attendance
можно найти там, где
date
поле равно
today
.
Это должно дать вам фактические пользовательские объекты, не связанные с
today
(хотя решение Виллема Ван Онсема проще).
Возможно, вам придется отрегулировать
'attendance_set'
в зависимости от названия вашей реальной модели.
users_not_present_today = User.objects.annotate(
today_attendance_count=Count('attendance_set', filter=Q(present=True, date=today)
).filter(today_attendance_count=0)
Во-первых, спасибо этим двум парням @willem и @AKX, которые заставили меня думать в правильном направлении.
Что я сделал, так это сначала доставил всем присутствующим сотрудникам
presents = Attendance.objects.filter(date=today)
затем исключите их из числа всех пользователей, например:
absent = User.objects.exclude(attendance_set__in=presents)
Это звучало так, как я хотел, чтобы это было ...