Импорт Нет полей в CSV - PullRequest
0 голосов
/ 16 мая 2019

У меня есть историческая таблица базы данных людей в заданиях, которая включает поля даты начала и окончания.Я вставляю из csv, и мой сценарий работал нормально, за исключением того, что Python / Django видит мои поля None как 'None', и он отказывается вставлять строки с пустыми датами окончания, то есть все текущие рабочие места пропускаются.Это, за исключением части попытки / исключения, не удалось:

    except ValidationError as v:
        if row['end_date'] == 'null' or 'None' or '':
            row['end_date'] = None

, как это было сделано:

    except ValidationError as v:
        if row['end_date'] in ['null', 'None', '']:
            row['end_date'] = None

Я решил проблему, отфильтровав текущие рабочие места и запустив их в отдельномCSV с сценарием, измененным на:

            end_date=None

Однако, что мне действительно нужно, так это какой-то способ использовать переменную, например, значение ...

        if row[value] == 'None':
            row[value] = None

, потому что у меня есть больше CSV дляrun, с другими полями, кроме дат, и некоторые из них также будут иметь пустые значения / значения None.

Заменит ли какой-нибудь вид строки замену работы?

        if row[value] == 'None':
            row[value].replace(row[value], None)

или, возможно, default =Нет в определении поля end_date в моей модели?Но тогда как мне заставить Django видеть значение по умолчанию вместо пустого / None в csv?Согласно документам, https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.Field.default «Значение по умолчанию используется, когда создаются новые экземпляры модели, а значение для поля не указывается».Но я не уверен, как это сработало бы здесь.Получу ли я значение по умолчанию или ValidationError?

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

Спасибо.

РЕДАКТИРОВАТЬ - код -

#! usr/local/bin/python3.7
# coding: utf-8

import csv
import sys
import logging

from os import environ
import django
sys.path.append('/home/malikarumi/Projects/hattie/hattie')

environ['DJANGO_SETTINGS_MODULE'] = 'hattie.settings'
django.setup()

from people.models import Company, Associate, CareerHistory
from django.utils.text import slugify
from django.db import IntegrityError
from django.core.exceptions import ValidationError
from django.contrib.contenttypes.models import ContentType


# logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
file_handler = logging.FileHandler('2019-05-13_inserts.txt')
logger.addHandler(file_handler)
file_handler.setFormatter(formatter)
file_handler.setLevel(logging.INFO)

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.setFormatter(formatter)


with open('members6') as csvfile:
    reader = csv.DictReader(csvfile, delimiter='\t')
    fieldnames = [
        'last_name', 'first_name', 'middle_name', 'suffix',
        'title', 'start_date', 'end_date'
    ]
    pc = ContentType.objects.get_for_model(Associate)
    org = ContentType.objects.get_for_model(Company)
    for row in reader:
        try:
            name_string = row['last_name'], row['first_name'], row['middle_name'], row['suffix']
            associate_instance = Associate.objects.create(
                last_name=row['last_name'], first_name=row['first_name'],
                middle_name=row['middle_name'], suffix=row['suffix'],
                slug=slugify(name_string))
            CareerHistory.objects.create(
                content_type_pc=pc, object_id_pc=associate_instance.uniqid,
                content_type_org=org, object_id_org="828f4116-38eb-4f0c-9c5a-96a93682d106",
                title=row['title'], start_date=row['start_date'],
                end_date=row['end_date']
            )
        except IntegrityError as e:
            logger.warning(f"Check for dupes: {name_string}, {e}")
            continue
        except ValidationError as v:
            if row['end_date'] in ['null', 'None', '']:
                row['end_date'] = None


p.s. This also gets a name error:
        value = row[f'{value}']

Редактировать - CSV

last_name   first_name  middle_name suffix  slug    title   start_date  end_date
Clarke  John    Hessin          Associate   1916-10-09  1922-09-18
Sutherland  George              Associate   1922-10-02  1938-01-17
Butler  Pierce              Associate   1923-01-02  1939-11-16
Sanford Edward  Terry           Associate   1923-02-19  1930-03-08
Roberts Owen    Josephus            Associate   1930-06-02  1945-07-31
Murphy  Frank               Associate   1940-02-05  1949-07-19
Byrnes  James   Francis         Associate   1941-07-08  1942-10-03
Jackson Robert  Houghwout           Associate   1941-07-11  1954-10-09
Rutledge    Wiley   Blount          Associate   1943-02-15  1949-09-10
Burton  Harold  Hitz            Associate   1945-10-01  1958-10-13
Clark   Tom Campbell            Associate   1949-08-24  1967-06-12
Minton  Sherman             Associate   1949-10-12  1956-10-15
Whittaker   Charles Evans           Associate   1957-03-25  1962-03-31
Paul John    Stevens            Associate   1975-12-19  2010-06-29
O’Connor    Sam  David         Associate   1981-09-25  2006-01-31
Thomas  Charles                Associate   1991-10-23  None
Green    Rayann    B.           Associate   1993-08-10  None
Branson  Stephen H.          Associate   1994-08-03  None
Allen   Samuel  A.  Jr.     Associate   2006-01-31  None
Sanchez   Sonia               Associate   2009-08-08  None
Kammisch   Elaine               Associate   2010-08-07  None
Gormley Nathan    M.          Associate   2017-04-10  None
King   Brad   M.          Associate   2018-10-06  None

1 Ответ

0 голосов
/ 16 мая 2019

- это не то, что вы после закрытия, а другой путь - как это:

if row[value]:
    #I have a value 
else:
   #row[value] doesn't exist

или просто обработать несуществующее будет:

if not row[value]:
   #row[value] doesn't exist
...