2015-10-11 3 views
0

У меня есть это поле имени в моей базе данных, и немало имен дубликатов. Я хочу, чтобы они были уникальными. Я знаю, что могу установить unique = True, но это поможет только в будущих записях. Я хочу знать все текущие записи с дублирующимися именами. Есть ли простой способ распечатать все имена, которые дублируются в модели врача?Получить дубликаты в django

class Doctor(models.Model): 
    name = models.CharField(max_length=1300) 
+1

Возможный дубликат [Django выбрать только строки с повторяющимися значениями поля] (http://stackoverflow.com/questions/8989221/django-select-only-rows-with-duplicate-field-values) – sobolevn

ответ

-4

класс Doctor (models.Model): имя = models.CharField (max_length = 1300, уникальный = True)

1

Чтобы избавиться от всех дубликатов из вашей базы данных, вы должны задать себе вопрос сначала - что с ними делать? Удалить? Слиться как-нибудь? Изменить имя каждого дубликата?

После ответа на этот вопрос просто создайте перенос данных (при миграции RunPython), которые будут выполнять желаемую операцию для каждой дублированной записи.

Чтобы найти все дубликаты, вы можете сделать:

with_duplicates = Doctor.objects.annotate(count=Count('id')).order_by('id').distinct('name').filter(count__gt=1) 

Этот запрос будет получать из базы данных первой (по идентификатору) запись из дублей группы (например, если у вас есть 3 доктора под названием «кто», то это будет возьмите первый из них, и он доставит только врачей с дубликатами).

Имея, что для каждого врача, которые имеют дубликаты, вы можете получить список того, что дублирует:

with_duplicates = Doctor.objects.annotate(count=Count('id')).order_by('id').distinct('name').filter(count__gt=1) 
for doctor in with_duplicates: 
    duplicates = Doctor.objects.filter(name=doctor.name).exclude(id=doctor.id) 

И сделать что-то с ними.