Python django-import-export данные модели импорта, даже если нет данных - PullRequest
0 голосов
/ 19 декабря 2018

Я использую django-import-export пакет для импорта данных из CSV-файла, в основном следуя руководству по началу работы в readthedocs

Я запутался в поведении пакета впростая конфигурация.

Моя модель похожа на:

class Experiment(models.Model):
    title = models.CharField(max_length=255, blank=False)
    description = models.TextField(blank=False)
    research_project = models.ForeignKey(
       ResearchProject, null=False, blank=False
    )

Я создал CSV-файл для проверки импорта.Файл /tmp/experiment.csv прост:

h1,h1,research_project
v1,v2,66

(обратите внимание, что первые два столбца csv имеют заголовки, которые не соответствуют ни одной из моделей полей)

Затем я создал ресурс:

class ExperimentResource(resources.ModelResource):

class Meta:
    model = Experiment
    exclude = ('id', )

def export(self, queryset=None, *args, **kwargs):
    queryset = Experiment.objects.filter(id=kwargs['id'])
    return super(ExperimentResource, self).export(queryset, *args, **kwargs)

def get_instance(self, instance_loader, row):
    return False

Теперь я могу попытаться импортировать /tmp/experiment.csv данных, вызвав:

dataset = Dataset().load(open('/tmp/experiment.csv').read())
result = ExperimentResource().import_data(dataset)
print(result.has_errors())  # for debug

Последняя строка печатает False, поскольку данные эффективно импортированы, а строка имеетдобавлен в базу данных.Но title и description были заполнены пустой строкой, даже если в модели Experiment эти два атрибута имеют blank=False.

Мои вопросы: почему django-import-export позволяет сохранять пустые строки для моделейу которых есть поля с blank=False параметрами?И почему пакет не проверяет заголовки набора данных для соответствующих полей модели?

Как заставить django-import-export проверять заголовки и пустые строки в полях, которые имеют blank=False?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

"почему django-import-export позволяет сохранять пустые строки для моделей, которые имеют поля с пустыми параметрами = False" =>

кажется, что django-import-export игнорирует пустой параметр, но вы можете добавить null =Ложь, это добавит ограничения также на уровне БД) и не позволит django-import-export писать незаполненные строки, я полагаю?что вы получите Ошибка на procass

0 голосов
/ 19 декабря 2018

Это потому, что blank=False относится только к формам, как описано в документах blank:

Если True, полеразрешено быть пустымПо умолчанию установлено значение False.

Обратите внимание, что это отличается от null.null чисто связан с базой данных, тогда как blank связан с проверкой.Если поле имеет blank=True, проверка формы позволит ввести пустое значение.Если поле имеет blank=False, поле будет обязательным.

Если вы не хотите запрещать сохранять пустые значения, установите null=False, но , помните nullдля CharField

ОБНОВЛЕНИЕ: поскольку приведенное выше решение не помогло, другим возможным решением было бы предоставить валидаторы для полей CharField. MinLengthValidator может помочь вам проверить незаполненные обязательные поля.

Примените его следующим образом:

title = models.CharField(max_length=255, blank=False, validators=[MinLengthValidator(1)])
description = models.TextField(blank=False, validators=[MinLengthValidator(1)])
...