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)
annotate
добавляет подсчет по людям, которым назначена встреча.filter
получить только аннотации с дублирующимися именами.filter
получить только те встречи, где более одного человека с дублированным именем.