Обнуляемый TextField или пустая строка в модели Django? - PullRequest
8 голосов
/ 16 февраля 2011

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

Но, скажем, в каком-то конкретном случае разрешение состоит в том, чтобы текстовое поле содержало пустое значение. Скажем, есть таблица user и столбец short_bio, который представлен TextField в Django и не является обязательным. Нет смысла создавать отдельную таблицу user_bio, верно?

Теперь вопрос в том, должно ли пустое значение быть пустой строкой или нулевым маркером ? Каковы плюсы и минусы для каждого варианта? Есть ли какие-то особенности в работе Django с базой данных, которые могут иметь значение?


Следует отметить, что django-lint в настоящее время сообщает об экземплярах CharField и TextField с null=True.

И наоборот, «сохранение пустой строки для поля, оставленного пустым, воспринимается некоторыми разработчиками .

как плохая идея».

Ответы [ 2 ]

17 голосов
/ 16 февраля 2011

Я думаю, что когда «пустая строка» означает «нет значения», следует использовать пустую строку, чтобы избежать смешивания нулей и пробелов, означающих одно и то же (например, при поиске или сравнении: в некоторых СУБД вы не можете сравниватьОт NULL к NULL напрямую, вы должны использовать оператор IS NULL).

Использование пустой строки также облегчит ее использование «как есть» в отчетах и ​​других материалах, где «short_bio» используется без передачичерез DOM (например, используя objects.values('short_bio')) без преобразования Null в ''.

Более того, Django docs состояние:

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

5 голосов
/ 25 февраля 2011

Если вам нужно пустое текстовое поле, которое должно быть уникальным , но допускает множественные значения NULL , может быть лучше использовать NULL вместо пустой строки.

Django всегда видит NULL как уникальные значения, в то время как пустая строка всегда равна другой пустой строке. См. Уникальные поля, допускающие пустые значения в Django и ticket 9039 .

Чтобы получить «лучшее из обоих миров», вы можете сохранить пустое значение как NULL, но отобразить как пустую строку через поле пользовательской формы. A (не проверенный) пример от mightyhal :

from django.db import models


class CharNullField(models.CharField):
    description = "Stores NULL but returns empty string"
    def to_python(self, value):
        # this may be the value right out of the db, or an instance
        if isinstance(value, models.CharField):
            # if an instance, return the instance
            return value
        if value == None:
            # if db has NULL (==None in Python), return empty string
            return ""
        else:
            return value # otherwise, return just the value
    def get_db_prep_value(self, value):
        # catches value right before sending to db
        if value == "":
            # if Django tries to save an empty string, send to db None (NULL)
            return None
        else:
            return value # otherwise, just pass the value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...