2011-02-16 19 views
8

Según entiendo de this database design question, se debe utilizar campos anulables con moderación y tomar una decisión pesó cada vez de si sería mejor volver a pensar el diseño de datos en su lugar.NULL TextField o cadena vacía en el modelo Django?

Pero digamos que en algún caso particular, la resolución es para permitir un campo de texto que contiene un valor vacío. Por ejemplo, hay user mesa y hay short_bio columna que está representado por el campo de texto en Django y no es obligatorio. No tiene sentido crear una tabla user_bio por separado, ¿verdad?

Ahora la pregunta es si el valor vacío es una cadena vacía o un marcador nulo? ¿Cuáles son los pros y los contras de cada opción? ¿Hay alguna información específica sobre cómo funciona Django con la base de datos que puede hacer la diferencia?


Cabe señalar que django-lint informa actualmente en casos Charfield y TextField con null=True.

Por el contrario, ‘almacenar una cadena vacía para un campo se deja en blanco se ve como una mala idea’ por some developers.

Respuesta

16

Creo que cuando 'cuerda vacía' significa 'sin valor', la cadena vacía debe usarse para evitar mezclar nulos y espacios en blanco que signifiquen lo mismo (p. Ej. Al buscar o comparar: en algunos DBMS no se puede compare NULL con NULL directamente, debe usar el operador IS NULL).

Usar la cadena vacía también facilitará su uso 'tal cual' en informes y otros productos donde se usa 'short_bio' sin pasar por el DOM (por ejemplo, usando objects.values('short_bio')), sin convertir Null en ''.

Por otra parte, Django docs Estado:

Evitar el uso de nulo en campos basados ​​en cadenas como CharField y TextField a menos que tenga una excelente razón. Si un campo basado en cadena tiene null = True, eso significa que tiene dos valores posibles para "sin datos": NULL y la cadena vacía. En la mayoría de los casos, es redundante tener dos valores posibles para "sin datos"; la convención de Django es usar la cadena vacía, no NULO.

+2

Gracias por el razonamiento y la mención de la convención de Django, que no se dio cuenta de docs. – Tony

5

Si necesita un campo de texto anulable que debe ser único pero permiten valores NULL múltiples, puede ser mejor usar NULL en lugar de cadena vacía.

Django siempre ve los nulos como valores únicos, por su parte cadena vacía es siempre igual a otra cadena vacía. Ver Unique fields that allow nulls in Django y ticket 9039.

tener ‘lo mejor de ambos mundos’ puede almacenar el valor vacío como NULL, pero la pantalla como una cadena vacía a través de campo de formulario personalizado. Un (no probado) by mightyhal ejemplo:

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 
Cuestiones relacionadas