Django находит дубликаты в двух таблицах

Я работаю над базой данных общественных деятелей и их должностей. У меня есть следующие модели:

class Person(models.Model):
    full_name = models.CharField()
    appointments = models.ManyToManyField('Appointment', through='PersonsNAppointments')

class Appointment(models.Model):
    position = models.CharField()
    persons = models.ManyToManyField('Person', through='PersonsNAppointments')

Имена не являются уникальными. Поэтому в ситуации, когда у меня есть Джон Донн(id_1) и Джон Донн(id_2) и "Джон Донн" получил назначение, они оба получат это назначение. Я хочу создать панель администратора, где будут показаны только люди с одинаковыми именами и одинаковыми назначениями, чтобы администратор мог обрабатывать эти дубликаты вручную. Мне нужна помощь в написании get_queryset.

Пока что я понял, как получить дублирующиеся имена

dup_names = Persons.objects.values('full_name')\
                .annotate(name_count=Count('id'))\
                .filter(name_count__gt=1).values('full_name')

dup_objects = Persons.objects.filter(full_name__in=dupes_names)

Как получить только тех людей, у которых одинаковые встречи?

Вы можете сделать это в одном запросе:

class MyDoublePersonsModelAdmin(ModelAdmin):
    model = Person
    def get_queryset(self, *args, **kwargs):
        quesryset = super().get_queryset(*args, **kwargs)
        return queryset.annotate(name_count=Count('appointments__persons__id').filter(appointments__persons__name = F('name'), name_count__gt = 1)
  1. annotate добавляет подсчет по людям, которым назначена встреча.
  2. filter получить только аннотации с дублирующимися именами.
  3. filter получить только те встречи, где более одного человека с дублированным именем.
Вернуться на верх