Как лучше всего работать с пустыми ('') строковыми значениями в полях модели, не допускающих значения NULL? - PullRequest
0 голосов
/ 11 июля 2020

В Django / postgres, если у вас есть поле, не допускающее значения NULL, все еще можно сохранить пустое str значение '' для определенных типов полей (например, CharField, TextField).

Примечание. Я не имею в виду blank=False, который просто определяет, отображается ли поле с помощью required в modelForm. Я имею в виду буквальное значение пустой строки.

Например, рассмотрим эту простую модель, которая имеет null=False на CharField:

class MyModel(models.Model):
    title = models.CharField('title', null=False)

Следующее выдает IntegrityError:

MyModel.objects.create(title=None)

В то время как следующее не создает и создает объект:

MyModel.objects.create(title='')

Является ли это непреднамеренным следствием объединения postgres с Django, или это предназначено / что практично использует ли он?

Если это непреднамеренно, как лучше всего с этим справиться? Должны ли каждые CharField и TextField с null=False также иметь CheckConstraint? Например,

Class Meta:
    constraints = [
        models.CheckConstraint(
            check=~models.Q(title=''),
            name='title_required'
        )
    ]

1 Ответ

1 голос
/ 11 июля 2020

Из документов Django:

https://docs.djangoproject.com/en/3.0/ref/models/fields/#django .db.models.Field.null

«Избегайте использования null в полях на основе строк, таких как CharField и TextField. Если строковое поле имеет значение null = True, это означает, что у него есть два возможных значения для «нет данных»: NULL и пустая строка. В большинстве случаев излишне иметь два возможных значения для «нет данных». ; » соглашение Django заключается в использовании пустой строки, а не NULL. "

Это потому, что существует распространенное заблуждение, что '' = NULL и Django решили go с этим. Я лично считаю, что это было плохое решение, но оно есть. Строка длины 0 по-прежнему является значением, как и целым числом = 0.

...