Хотите выполнить левое соединение в 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)

Это звучало так, как я хотел, чтобы это было ...

Другие вопросы по тегам