Django: импортировать CSV-файл и правильно обрабатывать конфликт уникальных значений - PullRequest
1 голос
/ 03 ноября 2010

Я хочу написать скрипт на Python для импорта содержимого файла CSV в базу данных приложения Django.Поэтому для каждой записи CSV я создаю экземпляр своей модели, устанавливаю соответствующие значения из проанализированной строки CSV и вызываю save для экземпляра модели.Например, см. Ниже:

for row in dataReader:
    person=Person()
    person.name=row[0]
    person.age=row[1]
    person.save()

Теперь предположим, что поле Имя помечено как уникальное в модели.Каков наилучший способ справиться с ситуацией, когда импортируемая запись имеет такое же значение имени, которое уже есть в базе данных?Должен ли я проверить это перед вызовом сохранения?Как?Должен ли я поймать исключение?Как будет выглядеть код?

РЕДАКТИРОВАТЬ: Если в БД уже существует запись с таким же полем имени, я все же хотел бы обновить другие поля.Например, если я импортировал Фреда 43 и уже была запись Фреда 42 в БД, он должен обновить БД до Фреда 43.

РЕДАКТИРОВАТЬ: Спасибо за всеответы.Я полагаю, что этот подход, на который указывает chefsmart, будет таким:

try:
    obj = Person.objects.get(name=name)
except Person.DoesNotExist:
    obj = Person()
    obj.name = name
obj.age = age
obj.save()

Ответы [ 4 ]

5 голосов
/ 03 ноября 2010

Одна из функций ормы Джанго, которую я так люблю, это get_or_create ()

поэтому я предлагаю вам сделать так:

for row in dataReader:
    person_record, created = person.get_or_create(name=row[0], age=row[1])

вы можете проверить после того, хотите ли вы изменить старую запись в person_record или проверить, была ли запись создана if created: и делать с ней все, что вы хотите ..

надеюсь, что это поможет

1 голос
/ 03 ноября 2010

См. Это http://blog.roseman.org.uk/2010/03/9/easy-create-or-update/

Я думаю, это можно адаптировать к вашему случаю.

1 голос
/ 03 ноября 2010

Примерно так:

for row in dataReader:
    try:
       Person.objects.get(name=row[0])
       #write some errlog here possibly or update the model
    except Person.DoesNotExist:
       Person.object.create(name=row[0],age=row[1])

Возможно, будет лучше узнать, что вы наткнулись на дубликат или нет.Также вы не зависите от того, была ли модель написана правильно или база данных поддерживает уникальные ключи и т. Д.

0 голосов
/ 03 ноября 2010

Поймай django.db.IntegrityError, я считаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...