2016-05-09 5 views
1

У меня есть модель с несколькими Charfield, установленными как blank = True, а не null в соответствии с рекомендациями по двум советам (см. Раздел 6.2.4).Ошибки Charfield null

class Supplier(models.Model): 
    unique_id = models.IntegerField(unique=True) 
    name = models.CharField(max_length=255, unique=True) 
    supplier_name = models.CharField(max_length=255, blank=True) 

Однако, когда я пытаюсь сохранить запись модель, которая не имеет None в поле Имя поставщика, я получаю сообщение об ошибке: django.db.utils.IntegrityError: нулевое значение в колонке «Имя поставщика» нарушает не-нулевое ограничение , Каков наилучший подход к решению этой проблемы? Должен ли я просто использовать null = True в объявлении поля или преобразовать None в пустую строку (не идеально)? Или другой подход?

+0

Как вы создаете экземпляр «Поставщик»? Если вы не укажете имя поставщика, например. 'Supplier.objects.create (unique_id = 1, name = 'example')', тогда я ожидал бы, что 'имя_процессора' будет сохранено как пустая строка. Однако, если вы явно задали 'поставщик_имя = нет', например. 'Supplier.objects.create (unique_id = 2, name = 'example2', supplier_name = None)', тогда Django попытается сохранить значение null, и вы получите 'IntegrityError'. Обратите внимание, что параметр 'blank = True' влияет на формы администратора и модели Django - он не влияет на базовую схему базы данных или автоматически преобразует' None' в '' ''. – Alasdair

+0

спасибо, что проблема. Я думал, что django автоматически конвертирует None в '', и я пытался сэкономить с 'поставщиком_name = None' – Yunti

+0

Рад, что это помогло, я добавил комментарий в качестве ответа. – Alasdair

ответ

2

Если вы не указали supplier_name, например. Supplier.objects.create(unique_id=1, name='example'), тогда я ожидал бы, что supplier_name будет сохранен как пустая строка.

Однако, если вы явно установили supplier_name=None, например. Supplier.objects.create(unique_id=2, name='example2', supplier_name=None), тогда Django постарается сохранить null, и вы получите IntegrityError.

Обратите внимание, что параметр blank = True влияет на формы модели и администратор Django. Он не влияет на базовую схему базы данных или автоматически конвертирует None в ''.

Причина, по которой два совпадающих файла и документа Django рекомендуют null=False, так это то, что '' является единственным значением для «нет данных». Если у вас есть null=True, тогда есть два значения для «нет данных», '' и None.

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

В вашем случае трудно сказать, что вам следует делать, потому что вы не указали код. В идеале держите null=True, чтобы придерживаться конвенции Django. Затем вы можете изменить свой код, чтобы не устанавливать supplier_name=None или преобразовать его с supplier_name = supplier_name or ''.

0

Если ваш штраф с сохранением этого поля как null, то используйте null=True еще одно преимущество использования null = true, вы не будете получать ошибку при обновлении в будущем, когда когда-либо будете добавлять другие файлы в той же модели, а затем каждый раз, когда вам нужно указать для default так что лучше использовать null = true, чтобы избежать этого.

Смежные вопросы