Referencia del campo del modelo

Este documento contiene todas las referencias de API del Field incluidas las opciones field options y los tipos field types que ofrece Django.

Ver también

Si los campos integrados no hacen el truco, puedes intentar con django-localflavor (documentación), que contiene piezas de código assorted útiles para países y culturas particulares.

También puedes escribir fácilmente tus propios campos del modelo personalizados </howto/custom-model-fields>.

Nota

Los campos se definen en django.db.models.fields, pero por conveniencia están importados en django.db.models. La convención estándar es utilizar from django.db import models y referirse a los campos como models.<Foo>Field.

Opciones del campo

Los siguientes argumentos están disponibles para todos los tipos de campo. Todos son opcionales.

null

Field.null

Si True, Django almacenará valores vacíos como NULL en la base de datos. Por defecto es False.

Evita utilizar :attr:`~Field.null en campos basados en cadenas como CharField y TextField. La convención de Django es usar una cadena vacía, no NULL, como estado «sin datos» para los campos basados en cadenas. Si un campo basado en cadenas tiene null=False, aún se pueden guardar cadenas vacías para «sin datos». Si un campo basado en cadenas 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». Una excepción es cuando un CharField tiene ambos unique=True y blank=True configurados. En esta situación, null=True se requiere para evitar violaciones de restricciones únicas al guardar múltiples objetos con valores en blanco.

Para ambos campos basados en cadenas y no basados en cadenas, también necesitarás establecer blank=True si deseas permitir valores vacíos en formularios, ya que el parámetro de atributo null solo afecta al almacenamiento en la base de datos (consultar blank).

Nota

Cuando se utiliza la base de datos backend Oracle, el valor NULL se almacenará para denotar la cadena vacía independientemente de esta atributo.

blank

Field.blank

Si True, el campo se permite estar en blanco. Por defecto es False.

Ten en cuenta que esto es diferente de null. null es puramente relacionado con la base de datos, mientras que blank es relacionado con la validación. Si un campo tiene blank=True, la validación de formularios permitirá la entrada de un valor vacío. Si un campo tiene blank=False, el campo será obligatorio.

Proporcionando valores faltantes

blank=True se puede utilizar con campos que tengan null=False, pero esto requerirá implementar el método clean() en el modelo para suministrar de forma programática los valores faltantes.

choices

Field.choices[fuente]

Una mapeo o iterable en el formato descrito a continuación, para utilizar como opciones para este campo. Si se dan opciones, se aplican mediante la validación del modelo y el widget de formulario predeterminado será un select box con estas opciones en lugar del campo de texto estándar.

Si se da un mapeo, el elemento clave es el valor real a establecer en el modelo, y el segundo elemento es el nombre legible por humanos. Por ejemplo:

YEAR_IN_SCHOOL_CHOICES = {
    "FR": "Freshman",
    "SO": "Sophomore",
    "JR": "Junior",
    "SR": "Senior",
    "GR": "Graduate",
}

También puedes pasar una secuencia consistente en iterables de exactamente dos elementos (por ejemplo [(A1, B1), (A2, B2), …]). El primer elemento en cada tupla es el valor real a establecer en el modelo, y el segundo elemento es el nombre legible por humanos. Por ejemplo:

YEAR_IN_SCHOOL_CHOICES = [
    ("FR", "Freshman"),
    ("SO", "Sophomore"),
    ("JR", "Junior"),
    ("SR", "Senior"),
    ("GR", "Graduate"),
]

choices también se pueden definir como un callable que no espera argumentos y devuelve cualquiera de los formatos descritos anteriormente. Por ejemplo:

def get_currencies():
    return {i: i for i in settings.CURRENCIES}


class Expense(models.Model):
    amount = models.DecimalField(max_digits=10, decimal_places=2)
    currency = models.CharField(max_length=3, choices=get_currencies)

Pasando un callable para choices puede ser particularmente útil cuando, por ejemplo, las opciones son:

  • el resultado de operaciones I/O-bindeadas (que podrían potencialmente ser cacheadas), como consultar una tabla en la misma o una base de datos externa, o acceder a las opciones desde un archivo estático.

  • una lista que es principalmente estable pero podría variar con el tiempo o entre proyectos. Ejemplos en esta categoría son utilizar aplicaciones de terceros que proporcionan una inventario bien conocido de valores, como monedas, países, idiomas, zonas horarias, etc.

En general, es mejor definir opciones dentro de una clase de modelo y definir un constante con nombre adecuado para cada valor:

from django.db import models


class Student(models.Model):
    FRESHMAN = "FR"
    SOPHOMORE = "SO"
    JUNIOR = "JR"
    SENIOR = "SR"
    GRADUATE = "GR"
    YEAR_IN_SCHOOL_CHOICES = {
        FRESHMAN: "Freshman",
        SOPHOMORE: "Sophomore",
        JUNIOR: "Junior",
        SENIOR: "Senior",
        GRADUATE: "Graduate",
    }
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {self.JUNIOR, self.SENIOR}

A continuación se presentan las traducciones de los textos originales.

También puedes recopilar tus opciones disponibles en grupos nombrados que se pueden utilizar con fines organizativos:

MEDIA_CHOICES = {
    "Audio": {
        "vinyl": "Vinyl",
        "cd": "CD",
    },
    "Video": {
        "vhs": "VHS Tape",
        "dvd": "DVD",
    },
    "unknown": "Unknown",
}

La clave de la asignación es el nombre a aplicar al grupo y el valor son las opciones dentro de ese grupo, consistiendo en el valor del campo y un nombre legible por humanos para una opción. Las opciones agrupadas pueden combinarse con opciones no agrupadas dentro de una sola asignación (como la opción "desconocido" en este ejemplo).

También puedes utilizar una secuencia, p. ej., una lista de 2-tuplas:

MEDIA_CHOICES = [
    (
        "Audio",
        (
            ("vinyl", "Vinyl"),
            ("cd", "CD"),
        ),
    ),
    (
        "Video",
        (
            ("vhs", "VHS Tape"),
            ("dvd", "DVD"),
        ),
    ),
    ("unknown", "Unknown"),
]

Ten en cuenta que las opciones pueden ser cualquier objeto de secuencia – no necesariamente una lista o tupla. Esto te permite construir opciones dinámicamente. Pero si encuentras que estás «hackeando» choices para hacerlo dinámico, probablemente estarías mejor utilizando una tabla de la base de datos con un ForeignKey. choices está destinado a datos estáticos que no cambian mucho, o nunca.

Nota

Se crea una nueva migración cada vez que cambia el orden de choices.

Para cada campo del modelo que tenga establecido choices, Django normalizará las opciones en una lista de 2-tuplas y agregará un método para recuperar el nombre legible por humanos para el valor actual del campo. Consulta get_FOO_display() en la documentación de la API de base de datos.

A menos que se establezca blank=False junto con un default en el campo, entonces se renderizará una etiqueta conteniendo "---------" con el cuadro desplegable. Para sobreescribir este comportamiento, agrega una tupla a choices conteniendo None; p. ej., (None, 'Tu cadena para mostrar'). Alternativamente, puedes utilizar una cadena vacía en lugar de None donde esto tenga sentido - como en un CharField.

Tipos de enumeración

Además, Django proporciona tipos de enumeración que puedes heredar para definir opciones de manera concisa:

from django.utils.translation import gettext_lazy as _


class Student(models.Model):
    class YearInSchool(models.TextChoices):
        FRESHMAN = "FR", _("Freshman")
        SOPHOMORE = "SO", _("Sophomore")
        JUNIOR = "JR", _("Junior")
        SENIOR = "SR", _("Senior")
        GRADUATE = "GR", _("Graduate")

    year_in_school = models.CharField(
        max_length=2,
        choices=YearInSchool,
        default=YearInSchool.FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {
            self.YearInSchool.JUNIOR,
            self.YearInSchool.SENIOR,
        }

Estos funcionan de manera similar a enum de la biblioteca estándar de Python, pero con algunas modificaciones:

  • Los valores de los miembros enumerados son una tupla de argumentos para utilizar al construir el tipo de datos concreto. Django admite agregar un valor de cadena adicional al final de esta tupla para ser utilizado como nombre legible por humanos, o label. El label puede ser una cadena translatable relajada. Por lo tanto, en la mayoría de los casos, el valor del miembro será una tupla de 2 elementos (valor, label). Consulte a continuación un ejemplo de subclasear utilizando un tipo de datos más complejo. Si no se proporciona una tupla o el último elemento no es una cadena (relajada) de string, el label se genera automáticamente desde el nombre del miembro.

  • Se agrega la propiedad .label en los valores para devolver el nombre legible por humanos.

  • Se agregan varias propiedades personalizadas a las clases enumeradas – .choices, .labels, .values, y .names – para hacer más fácil acceder a listas de esas partes separadas del enum.

    Advertencia

    Los nombres de estas propiedades no pueden usarse como nombres de miembros ya que confluirían.

  • Se aplica el uso de enum.unique() para asegurar que los valores no se definen múltiples veces. Esto es poco probable que sea esperado en las opciones de un campo.

Ten en cuenta que utilizar YearInSchool.SENIOR, YearInSchool['SENIOR'], o YearInSchool('SR') para acceder o buscar miembros enumerados funcionan como se espera, así como los propiedades .name y .value en los miembros.

Si no necesitas tener los nombres legibles por humanos traducidos, puedes hacer que se infieran del nombre del miembro (sustituyendo los guiones bajo con espacios y utilizando mayúsculas iniciales):

>>> class Vehicle(models.TextChoices):
...     CAR = "C"
...     TRUCK = "T"
...     JET_SKI = "J"
...
>>> Vehicle.JET_SKI.label
'Jet Ski'

Dado que el caso donde los valores de enum necesitan ser enteros es extremadamente común, Django proporciona la clase IntegerChoices. Por ejemplo:

class Card(models.Model):
    class Suit(models.IntegerChoices):
        DIAMOND = 1
        SPADE = 2
        HEART = 3
        CLUB = 4

    suit = models.IntegerField(choices=Suit)

También es posible hacer uso de la API Funcional del Enum con la salvedad de que los labels se generan automáticamente como se destaca arriba:

>>> MedalType = models.TextChoices("MedalType", "GOLD SILVER BRONZE")
>>> MedalType.choices
[('GOLD', 'Gold'), ('SILVER', 'Silver'), ('BRONZE', 'Bronze')]
>>> Place = models.IntegerChoices("Place", "FIRST SECOND THIRD")
>>> Place.choices
[(1, 'First'), (2, 'Second'), (3, 'Third')]

Si requieres soporte para un tipo de datos concreto distinto a int o str, puedes heredar de Choices y del tipo de datos concreto requerido, por ejemplo date para su uso con DateField.

class MoonLandings(datetime.date, models.Choices):
    APOLLO_11 = 1969, 7, 20, "Apollo 11 (Eagle)"
    APOLLO_12 = 1969, 11, 19, "Apollo 12 (Intrepid)"
    APOLLO_14 = 1971, 2, 5, "Apollo 14 (Antares)"
    APOLLO_15 = 1971, 7, 30, "Apollo 15 (Falcon)"
    APOLLO_16 = 1972, 4, 21, "Apollo 16 (Orion)"
    APOLLO_17 = 1972, 12, 11, "Apollo 17 (Challenger)"

Hay algunas consideraciones adicionales de las cuales debes ser consciente:

  • Tipos de enumeración no admiten grupos nombrados.

  • Porque una enumeración con un tipo de datos concreto requiere que todos los valores coincidan con el tipo, no se puede lograr sobrescribir la etiqueta blank label creando un miembro con un valor de None. En su lugar, establezca el atributo __empty__ en la clase:

    class Answer(models.IntegerChoices):
        NO = 0, _("No")
        YES = 1, _("Yes")
    
        __empty__ = _("(Unknown)")
    

db_column

Field.db_column

El nombre de la columna de la base de datos que utilizar para este campo. Si no se proporciona, Django utilizará el nombre del campo.

Si el nombre de tu columna de base de datos es una palabra reservada SQL o contiene caracteres que no están permitidos en los nombres de variables de Python —notablemente, la diagonal—, eso está bien. Django pone comillas a los nombres de columnas y tablas detrás de escena.

db_comment

Field.db_comment

El comentario sobre la columna de la base de datos a utilizar para este campo. Es útil para documentar campos para individuos con acceso directo a la base de datos que pueden no estar mirando tu código Django. Por ejemplo:

pub_date = models.DateTimeField(
    db_comment="Date and time when the article was published",
)

db_default

Field.db_default

El valor por defecto calculado por la base de datos para este campo. Este puede ser un valor literal o una función de la base de datos, como Now:

created = models.DateTimeField(db_default=Now())

Se pueden utilizar expresiones más complejas, siempre y cuando estén hechas a partir de literales y funciones de la base de datos:

month_due = models.DateField(
    db_default=TruncMonth(
        Now() + timedelta(days=90),
        output_field=models.DateField(),
    )
)

Los valores por defecto de la base de datos no pueden referirse a otros campos o modelos. Por ejemplo, esto es inválido:

end = models.IntegerField(db_default=F("start") + 50)

Si se establecen tanto db_default como Field.default, default tendrá prioridad al crear instancias en código Python. db_default seguirá estando configurado a nivel de base de datos y se utilizará cuando se inserten filas fuera del ORM o cuando se agregue un nuevo campo en una migración.

Si un campo tiene un db_default sin establecer default y no se asigna ningún valor al campo, se devuelve un objeto DatabaseDefault como el valor del campo en instancias de modelo no guardadas. El valor real para el campo se determina por la base de datos cuando se guarde la instancia de modelo.

db_index

Field.db_index

Si es True, se creará un índice de la base de datos para este campo.

Utiliza en su lugar la opción indexes.

Donde sea posible, utilice la opción Meta.indexes en lugar de db_index. En casi todos los casos, indexes proporciona más funcionalidad que db_index. db_index puede ser deprecado en el futuro.

db_tablespace

Field.db_tablespace[fuente]

El nombre de la tabla de espacio de base de datos a utilizar para el índice de este campo, si este campo está indexado. El valor por defecto es el DEFAULT_INDEX_TABLESPACE del proyecto, si está configurado, o el db_tablespace del modelo, si existe. Si el backend no admite espacios de tabla para índices, esta opción se ignora.

default

Field.default

El valor por defecto para el campo. Esto puede ser un valor o un objeto callable. Si es callable se llamará cada vez que se cree una nueva instancia del modelo.

El valor por defecto no puede ser un objeto mutable (instancia de modelo, list, set, etc.), ya que se utilizaría como referencia al mismo objeto en todas las nuevas instancias del modelo. En su lugar, envuélvete el valor deseado en una función callable. Por ejemplo, si quieres especificar un valor por defecto dict para JSONField, utiliza una función:

def contact_default():
    return {"email": "to1@example.com"}


contact_info = JSONField("ContactInfo", default=contact_default)

No se pueden utilizar lambdas como opciones de campo como default porque no pueden ser serializadas por las migraciones. Consulta la documentación sobre otras limitaciones.

Para campos como ForeignKey que mapean a instancias del modelo, los valores por defecto deben ser el valor de los campos a los que se refieren (pk a menos que to_field esté configurado) en lugar de instancias del modelo.

El valor por defecto se utiliza cuando se crean nuevas instancias del modelo y no se proporciona un valor para el campo. Cuando el campo es una clave primaria, también se utiliza el valor por defecto cuando el campo está establecido en None.

También puedes configurar el valor por defecto a nivel de base de datos con Field.db_default.

editable

Field.editable

Si es False, el campo no se mostrará en la interfaz administrativa ni en cualquier otro ModelForm. También se saltará durante la validación del modelo. El valor por defecto es True.

error_messages

Field.error_messages[fuente]

Los textos traducidos son:

Las claves de los mensajes de error incluyen null, blank, invalid, invalid_choice, unique, y unique_for_date. Las claves adicionales de mensajes de error se especifican para cada campo en la sección Tipos de campos a continuación.

Estos mensajes de error a menudo no se propagan a las formas. Consulte consideraciones-regarding-model-errormessages.

help_text

Field.help_text

El texto de ayuda adicional para ser mostrado con el widget de la forma. Es útil para la documentación incluso si tu campo no está utilizado en una forma.

Ten en cuenta que este valor no se escape a HTML en las formas generadas automáticamente. Esto te permite incluir HTML en help_text si lo deseas. Por ejemplo:

help_text = "Please use the following format: <em>YYYY-MM-DD</em>."

Alternativamente, puedes usar texto plano y django.utils.html.escape() para escapar cualquier carácter especial de HTML. Asegúrate de escapar cualquier texto de ayuda que pueda provenir de usuarios no confiables para evitar un ataque de inyección de código cruzado.

primary_key

Field.primary_key

Si True, este campo es la clave primaria del modelo.

Si no especificas primary_key=True para ningún campo en tu modelo y no has definido una clave primaria compuesta, Django agregará automáticamente un campo para contener la clave primaria. Por lo tanto, no necesitas establecer primary_key=True en ninguno de tus campos a menos que desees sobreescribir el comportamiento predeterminado de la clave primaria. El tipo de los campos de clave primaria auto-creados se puede especificar por aplicación en AppConfig.default_auto_field o globalmente en la configuración DEFAULT_AUTO_FIELD. Para más información, consulta campos de clave primaria auto-creados.

primary_key=True implica null=False y unique=True. Solo un campo por modelo puede establecer primary_key=True. Las claves primarias compuestas deben definirse utilizando CompositePrimaryKey en lugar de establecer esta bandera para todos los campos para mantener esta invariante.

El campo de clave primaria es de solo lectura. Si cambias el valor de la clave primaria en un objeto existente y luego lo guardas, se creará un nuevo objeto junto al antiguo.

El campo de clave primaria se establece en None cuando se elimina un objeto mediante deleting.

Se agregó el campo CompositePrimaryKey.

único

Field.unique[fuente]

Si True, este campo debe ser único a lo largo de la tabla.

Esto se aplica tanto en el nivel del servidor de bases de datos como mediante la validación del modelo. Si intentas guardar un modelo con un valor duplicado en un campo unique, se levantará una django.db.IntegrityError por parte del método save() del modelo.

Esta opción es válida para todos los tipos de campos excepto ManyToManyField y OneToOneField.

Ten en cuenta que cuando unique es True, no necesitas especificar db_index, porque unique implica la creación de un índice.

unique_for_date

Field.unique_for_date

Establece esto con el nombre de un campo DateField o DateTimeField para requerir que este campo sea único para el valor del campo de fecha.

Por ejemplo, si tienes un campo title con unique_for_date="pub_date", entonces Django no permitirá la entrada de dos registros con el mismo title y pub_date.

Tenga en cuenta que si establece esto para apuntar a un campo de tipo DateTimeField, solo se considerará la parte de fecha del campo. Además, cuando USE_TZ esté configurado como True, el chequeo se realizará en la zona horaria actual <default-current-time-zone> al momento en que el objeto se guarde.

Esto se impone mediante Model.validate_unique() durante la validación del modelo, pero no a nivel de base de datos. Si alguna restricción de unique_for_date involucra campos que no forman parte de un formulario de modelo ModelForm (por ejemplo, si uno de los campos está en exclude o tiene editable=False), Model.validate_unique() saltará la validación para esa restricción particular.

unique_for_month

Field.unique_for_month

Al igual que unique_for_date, pero requiere que el campo sea único con respecto al mes.

unique_for_year

Field.unique_for_year

Al igual que unique_for_date y unique_for_month.

verbose_name

Field.verbose_name

Un nombre legible por humanos para el campo. Si no se proporciona un nombre verbal, Django creará automáticamente uno utilizando el nombre de atributo del campo, convirtiendo los guiones bajos en espacios. Consulte la documentación sobre <verbose-field-names> nombres de campos verbales.

validators

Field.validators[fuente]

Una lista de validadores para ejecutar para este campo. Consulte la documentación sobre <ref/validators> validadores para obtener más información.

Tipos de campos

AutoField

class AutoField(**options)[fuente]

Un IntegerField que incrementa automáticamente según estén disponibles los IDs. Normalmente no necesitarás utilizar este directamente; un campo de clave primaria se agregará automáticamente a tu modelo si no especificas lo contrario. Consulta la sección campos-de-llave-primaria-automaticos.

BigAutoField

class BigAutoField(**options)[fuente]

Un entero de 64 bits, similar a un AutoField excepto que está garantizado que encajará números desde 1 hasta 9223372036854775807.

BigIntegerField

class BigIntegerField(**options)[fuente]

Un entero de 64 bits, similar a un IntegerField excepto que está garantizado que encajará números desde -9223372036854775808 hasta 9223372036854775807. El widget de formulario por defecto para este campo es una NumberInput.

BinaryField

class BinaryField(max_length=None, **options)[fuente]

Un campo para almacenar datos binarios crudos. Puede asignarse bytes, bytearray o memoryview.

Por defecto, BinaryField establece editable en False, en cuyo caso no se puede incluir en un ModelForm.

BinaryField.max_length

Opcional. La longitud máxima (en bytes) del campo. La longitud máxima se aplica mediante la validación de Django utilizando MaxLengthValidator.

Abusando de BinaryField

Aunque podrías pensar en almacenar archivos en la base de datos, considera que es una mala práctica en el 99% de los casos. Este campo no es un reemplazo para manejar las archivos estáticos correctamente.

BooleanField

class BooleanField(**options)[fuente]

Un campo verdadero/falso.

El widget de formulario predeterminado para este campo es CheckboxInput, o NullBooleanSelect si null=True.

El valor por defecto de BooleanField es None cuando no se define Field.default.

CompositePrimaryKey

class CompositePrimaryKey(*field_names, **options)[fuente]

Un campo virtual utilizado para definir una clave primaria compuesta.

Este campo debe ser definido como la atributo pk del modelo. Si está presente, Django creará la tabla de modelo subyacente con una clave primaria compuesta.

El argumento *field_names es una lista de nombres de campos posicionales que componen la clave primaria.

Consulte Claves primarias compuestas para obtener más detalles.

CharField

class CharField(max_length=None, **options)[fuente]

Un campo de cadena para cadenas pequeñas a grandes.

Para cantidades grandes de texto, utilice TextField.

El widget de formulario predeterminado para este campo es un TextInput.

CharField tiene los siguientes argumentos adicionales:

CharField.max_length

La longitud máxima (en caracteres) del campo. El max_length se aplica en el nivel de la base de datos y en la validación de Django utilizando MaxLengthValidator. Es obligatorio para todos los backends de bases de datos incluidos con Django excepto PostgreSQL y SQLite, que admiten columnas VARCHAR ilimitadas.

Nota

Si está escribiendo una aplicación que debe ser portátil a múltiples backends de base de datos, debería tener en cuenta las restricciones del max_length para algunos backends. Consulte los notas sobre el backend de la base de datos para obtener más detalles.

Se agregó soporte a columnas VARCHAR ilimitadas en SQLite.

CharField.db_collation

Opcional. El nombre de collación de la base de datos del campo.

Nota

Los nombres de collación no están estandarizados. Como tal, esto no será portátil entre múltiples backends de bases de datos.

Oracle

Oracle admite solo las collaciones cuando el parámetro de inicialización de la base de datos MAX_STRING_SIZE está configurado en EXTENDED.

DateField

class DateField(auto_now=False, auto_now_add=False, **options)[fuente]

La fecha, representada en Python por una instancia de datetime.date. Tiene unos pocos argumentos adicionales y opcionales:

DateField.auto_now

Establece automáticamente el campo a la fecha actual cada vez que se guarda el objeto. Útil para «timestamp de última modificación». Ten en cuenta que siempre se utiliza la fecha actual; no es solo un valor por defecto que puedes sobrescribir.

El campo se actualiza automáticamente solo cuando se llama al método Model.save(). El campo no se actualiza cuando se realizan actualizaciones de otros campos de otras maneras, como QuerySet.update(), aunque puedes especificar un valor personalizado para el campo en una actualización como esa.

DateField.auto_now_add

Establece automáticamente el campo a la fecha actual cuando se crea el objeto por primera vez. Útil para la creación de timestamps. Ten en cuenta que siempre se utiliza la fecha actual; no es solo un valor por defecto que puedes sobrescribir. Por lo tanto, incluso si estableces un valor para este campo al crear el objeto, se ignorará. Si deseas poder modificar este campo, configura las siguientes opciones en lugar de auto_now_add=True:

El widget de formulario predeterminado para este campo es un DateInput. El admin agrega un calendario JavaScript y una atajo para «Hoy». Incluye un mensaje de error adicional invalid_date.

Las opciones auto_now_add, auto_now y default son mutuamente excluyentes. Cualquier combinación de estas opciones dará como resultado un error.

Nota

Como se implementa actualmente, establecer auto_now o auto_now_add en True causará que el campo tenga editable=False y blank=True configurados.

Nota

Las opciones auto_now y auto_now_add siempre utilizarán la fecha en la zona horaria por defecto en el momento de creación o actualización. Si necesitas algo diferente, podrías considerar usar un valor predeterminado llamable propio o sobrescribir save() en lugar de usar auto_now o auto_now_add; o utilizar un DateTimeField en lugar de un DateField y decidir cómo manejar la conversión de datetime a date en el momento del display.

Advertencia

Always use DateField con una instancia de datetime.date.

Si tienes una instancia de datetime.datetime, se recomienda convertirla a datetime.date primero. Si no lo haces, DateField localizará la datetime.datetime en el zona horaria por defecto y la convertirá a una instancia de datetime.date, eliminando su componente de tiempo. Esto es cierto tanto para el almacenamiento como para la comparación.

Advertencia

En PostgreSQL y MySQL, las operaciones aritméticas en un DateField con una timedelta devuelven un datetime en lugar de un date. Esto ocurre porque Python’s timedelta se convierte a SQL INTERVAL, y la operación SQL date +/- interval devuelve un timestamp en estas bases de datos.

Para asegurarte de obtener un resultado de tipo date, utiliza uno de los siguientes enfoques. O bien, explícitamente convierte el resultado a una fecha:

import datetime
from django.db.models import DateField, F
from django.db.models.functions import Cast

qs = MyModel.objects.annotate(
    previous_day=Cast(
        F("date_field") - datetime.timedelta(days=1),
        output_field=DateField(),
    )
)

O en PostgreSQL solo, utiliza aritmética entera para representar días

from django.db.models import DateField, ExpressionWrapper, F

qs = MyModel.objects.annotate(
    previous_day=ExpressionWrapper(
        F("date_field") - 1,  # Subtract 1 day as integer
        output_field=DateField(),
    )
)

DateTimeField

class DateTimeField(auto_now=False, auto_now_add=False, **options)[fuente]

Una fecha y hora, representada en Python por una instancia de datetime.datetime. Acepta los mismos argumentos adicionales que DateField.

El widget de formulario predeterminado para este campo es un solo DateTimeInput. El administrador utiliza dos widgets de texto separados TextInput con atajos de JavaScript.

Advertencia

Siempre utiliza DateTimeField con una instancia de datetime.datetime.

Si tienes una instancia de datetime.date, se recomienda convertirla a datetime.datetime primero. Si no lo haces, DateTimeField utilizará la medianoche en el zona horaria por defecto para el componente de tiempo. Esto es cierto tanto para el almacenamiento como para la comparación. Para comparar la parte de fecha de un DateTimeField con una instancia de datetime.date, utiliza el date lookup.

DecimalField

class DecimalField(max_digits=None, decimal_places=None, **options)[fuente]

Un número decimal fijo de precisión, representado en Python por una instancia de Decimal. Valida la entrada utilizando DecimalValidator.

Los siguientes argumentos son requeridos:

DecimalField.max_digits

El número máximo de dígitos permitido en el número. Ten en cuenta que este número debe ser mayor o igual a decimal_places.

DecimalField.decimal_places

El número de decimales para almacenar con el número.

Por ejemplo, para almacenar números hasta 999.99 con una resolución de 2 decimales, utilizarías:

models.DecimalField(..., max_digits=5, decimal_places=2)

Y para almacenar números hasta aproximadamente un billón con una resolución de 10 decimales:

models.DecimalField(..., max_digits=19, decimal_places=10)

El widget de formulario predeterminado para este campo es NumberInput cuando localize es False o TextInput en caso contrario.

Nota

Para obtener más información sobre las diferencias entre las clases FloatField y DecimalField, consulte FloatField vs. DecimalField. También debes estar al tanto de limitaciones de SQLite para campos decimales.

DurationField

class DurationField(**options)[fuente]

Un campo para almacenar períodos de tiempo - modelado en Python por timedelta. Cuando se utiliza en PostgreSQL, el tipo de datos utilizado es interval y en Oracle el tipo de datos es INTERVAL DAY(9) TO SECOND(6). De lo contrario, se utiliza un bigint de microsegundos.

Nota

La aritmética con DurationField funciona en la mayoría de los casos. Sin embargo, al comparar el valor de un campo DurationField con la aritmética en instancias de DateTimeField no funcionará como se espera en todas las bases de datos excepto PostgreSQL.

Campo de correo electrónico

class EmailField(max_length=254, **options)[fuente]

Un CharField que verifica que el valor es una dirección de correo electrónico válida utilizando EmailValidator.

Campo de archivo

class FileField(upload_to='', storage=None, max_length=100, **options)[fuente]

Un campo de subida de archivo.

Nota

El argumento primary_key no está soportado y lanzará un error si se utiliza.

Tiene los siguientes argumentos opcionales:

FileField.upload_to

Esta atributo proporciona una forma de establecer el directorio de carga y nombre del archivo, y puede ser configurado de dos maneras. En ambos casos, el valor se pasa al método Storage.save().

Si especificas un valor de cadena o un Path, puede contener formateo con strftime(), que se reemplazará por la fecha/hora de carga del archivo (para evitar que los archivos cargados llenen el directorio dado). Por ejemplo:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to="uploads/")
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to="uploads/%Y/%m/%d/")

Si estás utilizando el almacenamiento por defecto FileSystemStorage, el valor de cadena se agregará a tu MEDIA_ROOT ruta para formar la ubicación en el sistema de archivos local donde los archivos cargados se almacenarán. Si estás utilizando un almacenamiento diferente, consulta la documentación de ese almacenamiento para ver cómo maneja upload_to.

upload_to también puede ser una función llamable, como una función. Esta será llamada para obtener el camino de carga, incluido el nombre del archivo. Esta función debe aceptar dos argumentos y devolver un camino Unix-style (con barras diagonales) que se pasará al sistema de almacenamiento. Los dos argumentos son:

Argumento

Descripción

instance

Una instancia del modelo donde se define el campo FileField. De manera más específica, es la instancia particular donde se está cargando actualmente el archivo.

En la mayoría de los casos, este objeto no habrá sido guardado en la base de datos aún, por lo que si utiliza el campo AutoField predeterminado, no tendrá un valor para su campo de clave primaria.

nombre del archivo

El nombre de archivo que se le dio originalmente al archivo. Esto puede o no tener en cuenta cuando se determina el camino final de destino.

Por ejemplo:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return "user_{0}/{1}".format(instance.user.id, filename)


class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)
FileField.storage

Un objeto de almacenamiento, o una función que devuelve un objeto de almacenamiento. Maneja el almacenamiento y recuperación de tus archivos. Consulte la documentación Gestión de archivos para obtener detalles sobre cómo proporcionar este objeto.

El widget de formulario predeterminado para este campo es un ClearableFileInput.

Utilizar un FileField o un ImageField (consulte a continuación) en un modelo requiere unos pocos pasos:

  1. En tu archivo de configuración, necesitarás definir MEDIA_ROOT como el camino completo a un directorio donde deseas que Django almacene los archivos subidos. (Para rendimiento, estos archivos no se almacenan en la base de datos.) Define MEDIA_URL como la URL pública base de ese directorio. Asegúrate de que este directorio sea writable por el usuario del servidor web.

  2. Agrega el FileField o el ImageField a tu modelo, definiendo la opción upload_to para especificar un subdirectorio de MEDIA_ROOT para usar para los archivos subidos.

  3. Todo lo que se almacenará en tu base de datos es una ruta al archivo (relativa a MEDIA_ROOT). Es probable que desees utilizar la conveniencia url proporcionada por Django. Por ejemplo, si tu campo ImageField se llama mug_shot, puedes obtener el camino absoluto a tu imagen en un template con {{ object.mug_shot.url }}.

Por ejemplo, supongamos que has establecido MEDIA_ROOT en '/home/media', y upload_to está configurado para 'photos/%Y/%m/%d'. La parte '%Y/%m/%d' de upload_to es formateo con strftime(); '%Y' es el año de cuatro dígitos, '%m' es el mes de dos dígitos y '%d' es el día de dos dígitos. Si subes un archivo el 15 de enero de 2007, se guardará en el directorio /home/media/photos/2007/01/15.

Si deseas recuperar el nombre del archivo en disco subido o el tamaño del archivo, podrías utilizar las propiedades name y size respectivamente; para obtener más información sobre las propiedades y métodos disponibles, consulta la referencia de clase File y la guía de temas Gestión de archivos.

Nota

El archivo se guarda como parte de la guardado del modelo en la base de datos, por lo que el nombre de archivo real utilizado en disco no puede confiarse hasta después de que el modelo haya sido guardado.

La URL relativa del archivo subido se puede obtener utilizando el atributo url. Internamente, esto llama al método url() del almacenamiento subyacente Storage.

Ten en cuenta que siempre que trates con archivos subidos, debes prestar mucha atención a dónde los estás subiendo y qué tipo de archivos son, para evitar agujeros de seguridad. Valida todos los archivos subidos para asegurarte de que los archivos son lo que crees que son. Por ejemplo, si permites que alguien suba archivos sin validación a un directorio dentro del ámbito del servidor web, entonces alguien podría subir un script CGI o PHP y ejecutar ese script visitando su URL en tu sitio. No permitas eso.

También ten en cuenta que incluso un archivo HTML subido, ya que puede ser ejecutado por el navegador (aunque no por el servidor), puede suponer amenazas de seguridad equivalentes a ataques XSS o CSRF.

Las instancias de FileField se crean en tu base de datos como columnas varchar con una longitud máxima predeterminada de 100 caracteres. Al igual que con otros campos, puedes cambiar la longitud máxima utilizando el argumento max_length.

FileField y FieldFile

class FieldFile[fuente]

Cuando accedes a un FileField en un modelo, se te da una instancia de FieldFile como proxy para acceder al archivo subyacente.

La API de FieldFile refleja la de File, con una diferencia clave: El objeto envuelto por la clase no es necesariamente un envoltorio alrededor del objeto de archivo incorporado de Python. En su lugar, es un envoltorio alrededor del resultado del método Storage.open(), que puede ser un objeto File o una implementación personalizada del API de File.

Además de la API heredada de File como read() y write(), FieldFile incluye varios métodos que se pueden utilizar para interactuar con el archivo subyacente:

Advertencia

Dos métodos de esta clase, save() y delete(), tienen por defecto a guardar el objeto modelo asociado del FieldFile en la base de datos.

FieldFile.name

El nombre del archivo incluyendo la ruta relativa desde la raíz del Storage asociado al campo FileField.

FieldFile.path[fuente]

Una propiedad de solo lectura para acceder a la ruta de sistema de archivos local del archivo llamando el método path() del almacenamiento subyacente Storage.

FieldFile.size[fuente]

El resultado del método Storage.size() del almacenamiento subyacente.

FieldFile.url[fuente]

Una propiedad de solo lectura para acceder a la URL relativa del archivo llamando el método url() del almacenamiento subyacente Storage.

FieldFile.open(mode='rb')[fuente]

Abre o vuelve a abrir el archivo asociado con esta instancia en la especificada mode. A diferencia del método estándar de Python open(), no devuelve un descriptor de archivo.

Dado que el archivo subyacente se abre implícitamente al acceder a él, puede ser innecesario llamar a este método excepto para resetear el puntero al archivo subyacente o cambiar la mode.

FieldFile.close()[fuente]

Se comporta como el método estándar de Python file.close() y cierra el archivo asociado con esta instancia.

FieldFile.save(name, content, save=True)[fuente]

Este método toma un nombre de archivo y contenido del archivo y los pasa a la clase de almacenamiento para el campo, luego asocia el archivo almacenado con el campo del modelo. Si deseas asociar manualmente datos de archivos con instancias de FileField en tu modelo, se utiliza el método save() para persistir esos datos de archivo.

Toma dos argumentos requeridos: name que es el nombre del archivo, y content que es un objeto conteniendo los contenidos del archivo. El argumento opcional save controla si se guarda la instancia del modelo después de que el archivo asociado con este campo ha sido modificado. Por defecto es True.

Ten en cuenta que el argumento content debe ser una instancia de django.core.files.File, no un objeto de archivo de Python incorporado. Puedes construir un File a partir de un objeto de archivo de Python existente como se muestra aquí:

from django.core.files import File

# Open an existing file using Python's built-in open()
f = open("/path/to/hello.world")
myfile = File(f)

Puedes construirla desde una cadena de Python como esta:

from django.core.files.base import ContentFile

myfile = ContentFile("hello world")

Para más información, vea:doc:/topics/files.

FieldFile.delete(save=True)[fuente]

Elimina el archivo asociado con esta instancia y elimina todos los atributos del campo. Nota: Este método cerrará el archivo si sucede a ser abierto cuando se llama delete().

El argumento opcional save controla si se guarda o no la instancia del modelo después de que el archivo asociado con este campo haya sido eliminado. Por defecto, es True.

Ten en cuenta que cuando se elimina un modelo, los archivos relacionados no se eliminan. Si necesitas limpiar archivos huérfanos, deberás manejarlo tú mismo (por ejemplo, mediante una orden de gestión personalizada que puede ejecutarse manualmente o programada para ejecutarse periódicamente a través de e.g. cron).

FilePathField

class FilePathField(path='', match=None, recursive=False, allow_files=True, allow_folders=False, max_length=100, **options)[fuente]

Un campo de caracteres (CharField) cuyas opciones están limitadas a los nombres de archivo en un directorio específico del sistema de archivos. Tiene algunas argumentos especiales, de los cuales el primero es obligatorio.

FilePathField.path

Requerido. La ruta de sistema de archivos absoluta a un directorio desde el que este campo de archivo de ruta (FilePathField) debería obtener sus opciones. Ejemplo: "/home/images".

path también puede ser una función llamable, como una función para establecer dinámicamente el camino en tiempo de ejecución. Ejemplo:

import os
from django.conf import settings
from django.db import models


def images_path():
    return os.path.join(settings.LOCAL_FILE_DIR, "images")


class MyModel(models.Model):
    file = models.FilePathField(path=images_path)
FilePathField.match

Opcional. Una expresión regular, como una cadena de texto, que FilePathField utilizará para filtrar nombres de archivo. Tenga en cuenta que la regex se aplicará al nombre de archivo base, no al camino completo. Ejemplo: "foo.*\.txt$", que coincidirá con un archivo llamado foo23.txt pero no bar.txt o foo23.png.

FilePathField.recursive

Opcional. Puede ser True o False. Por defecto es False. Especifica si se deben incluir todas las subcarpetas de path

FilePathField.allow_files

Optional. Opcional. Ya sea True o False. Por defecto es True. Especifica si los archivos en la ubicación especificada deben incluirse. Ya sea esta opción o allow_folders debe ser True.

FilePathField.allow_folders

Opcional. Ya sea True o False. Por defecto es False. Especifica si los directorios en la ubicación especificada deben incluirse. Ya sea esta opción o allow_files debe ser True.

El único potencial problema es que match se aplica al nombre de archivo base, no a la ruta completa. Por lo tanto, este ejemplo:

FilePathField(path="/home/images", match="foo.*", recursive=True)

…seleccionará /home/images/foo.png pero no /home/images/foo/bar.png porque match se aplica al nombre de archivo base (foo.png y bar.png).

Instancias de la clase FilePathField se crean en su base de datos como columnas varchar con una longitud máxima predeterminada de 100 caracteres. Al igual que con otros campos, puede cambiar la longitud máxima utilizando el argumento max_length.

FloatField

class FloatField(**options)[fuente]

Un número flotante representado en Python por una instancia de float.

El widget de formulario predeterminado para este campo es NumberInput cuando localize es False o TextInput en caso contrario.

FloatField vs. DecimalField

La clase FloatField a veces se confunde con la clase DecimalField. Aunque ambos representan números reales, los representan de manera diferente. FloatField utiliza el tipo float de Python internamente, mientras que DecimalField utiliza el tipo Decimal de Python. Para obtener información sobre la diferencia entre las dos, consulte la documentación de Python para el módulo decimal.

GeneratedField

class GeneratedField(expression, output_field, db_persist=None, **kwargs)[fuente]

Un campo que siempre se calcula en función de otros campos del modelo. Este campo está gestionado y actualizado por la base de datos misma. Utiliza la sintaxis SQL GENERATED ALWAYS.

Hay dos tipos de columnas generadas: almacenadas y virtuales. Una columna generada almacenada se calcula cuando se escribe (se inserta o actualiza) y ocupa espacio de almacenamiento como si fuera una columna regular. Una columna generada virtual no ocupa espacio de almacenamiento y se calcula cuando se lee. Por lo tanto, una columna generada virtual es similar a una vista y una columna generada almacenada es similar a una vista materializada.

GeneratedField.expression

Un Expression utilizado por la base de datos para establecer automáticamente el valor del campo cada vez que se modifica el modelo.

Las expresiones deben ser determinísticas y solo referenciar campos dentro del modelo (en la misma tabla de la base de datos). Las columnas generadas no pueden referenciar otras columnas generadas. Los backends de bases de datos pueden imponer restricciones adicionales.

GeneratedField.output_field

Una instancia de campo de modelo para definir el tipo de dato del campo.

GeneratedField.db_persist

Determina si la columna de la base de datos debe ocupar espacio de almacenamiento como si fuera una columna real. Si False, la columna actúa como una columna virtual y no ocupa espacio de almacenamiento en la base de datos.

Sólo PostgreSQL admite columnas persistidas. Sólo Oracle admite columnas virtuales.

Refrescar los datos

Dado que la base de datos calcula el valor, el objeto debe ser recargado para acceder al nuevo valor después de save(), por ejemplo, utilizando refresh_from_db().

Limitaciones de la base de datos

Hay muchas restricciones específicas de la base de datos sobre campos generados que Django no valida y la base de datos puede levantar un error. Por ejemplo, PostgreSQL requiere que las funciones y operadores referenciados en una columna generada estén marcados como IMMUTABLE.

You siempre debes comprobar que expression está soportado en tu base de datos. Consulta los documentos de MariaDB, MySQL, Oracle, PostgreSQL o SQLite.

GenericIPAddressField

class GenericIPAddressField(protocol='both', unpack_ipv4=False, **options)[fuente]

Una dirección IPv4 o IPv6, en formato de cadena (por ejemplo, 192.0.2.30 o 2a02:42fe::4). El widget de formulario por defecto para este campo es un TextInput.

La normalización de direcciones IPv6 sigue la RFC 4291 Section 2.2 sección 2.2, incluyendo el uso del formato IPv4 sugerido en el párrafo 3 de esa sección, como ::ffff:192.0.2.0. Por ejemplo, 2001:0::0:01 se normalizaría a 2001::1, y ::ffff:0a0a:0a0a a ::ffff:10.10.10.10. Todos los caracteres se convierten a minúsculas.

GenericIPAddressField.protocol

Limita los valores de entrada válidos al protocolo especificado. Los valores aceptados son 'both' (por defecto), 'IPv4' o 'IPv6'. El matching es insensible a mayúsculas y minúsculas.

GenericIPAddressField.unpack_ipv4

Desempaca direcciones IPv4 mapeadas como ::ffff:192.0.2.1. Si esta opción está habilitada, esa dirección se desempacaría a 192.0.2.1. El valor por defecto es deshabilitado. Solo puede usarse cuando protocol está configurado en 'both'.

Si permites valores en blanco, debes permitir valores nulos ya que los valores en blanco se almacenan como nulos.

ImageField

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)[fuente]

Hereda todas las atributos y métodos de FileField, pero también valida que el objeto subido sea una imagen válida.

Además de las atributos especiales disponibles para FileField, un campo ImageField también tiene los atributos height y width.

Para facilitar la consulta sobre esos atributos, el campo ImageField tiene los siguientes argumentos opcionales:

ImageField.height_field

Nombre de un campo de modelo que se auto-población con la altura de la imagen cada vez que se establece un objeto de imagen.

ImageField.width_field

Nombre de un campo de modelo que se auto-población con el ancho de la imagen cada vez que se establece un objeto de imagen.

Requiere la biblioteca pillow.

Campo de imagen se crean en tu base de datos como columnas varchar con una longitud máxima predeterminada de 100 caracteres. Al igual que otros campos, puedes cambiar la longitud máxima utilizando el argumento max_length.

El widget de formulario predeterminado para este campo es un ClearableFileInput.

IntegerField

class IntegerField(**options)[fuente]

Un entero. Solo se permiten valores entre ciertos puntos (dependientes del motor de base de datos). Los valores desde -2147483648 a 2147483647 son compatibles en todos los motores de bases de datos admitidos por Django.

Utiliza MinValueValidator y MaxValueValidator para validar la entrada según los valores que admite el motor de base de datos predeterminado.

El widget de formulario predeterminado para este campo es NumberInput cuando localize es False o TextInput en caso contrario.

JSONField

class JSONField(encoder=None, decoder=None, **options)[fuente]

Un campo para almacenar datos codificados en JSON. En Python, los datos se representan en su formato nativo: diccionarios, listas, cadenas, números, booleanos y None.

JSONField está soportado en MariaDB, MySQL, Oracle, PostgreSQL y SQLite (con la extensión JSON1 habilitada).

JSONField.encoder

Una clase de codificador JSON opcional json.JSONEncoder para serializar tipos de datos no admitidos por el serializador JSON estándar (por ejemplo, datetime.datetime o UUID). Por ejemplo, puedes utilizar la clase DjangoJSONEncoder.

Por defecto utiliza json.JSONEncoder.

JSONField.decoder

Una clase de descodificador JSON opcional json.JSONDecoder para deserializar el valor recuperado desde la base de datos. El valor estará en el formato elegido por el codificador personalizado (generalmente una cadena). Tu deserialización puede necesitar tener en cuenta el hecho de que no puedes estar seguro del tipo de entrada. Por ejemplo, corres el riesgo de devolver un datetime que era realmente una cadena que solo sucedió coincidir con el formato elegido para datetime.

Por defecto utiliza json.JSONDecoder.

Para consultar JSONField en la base de datos, consulta Consultar JSONField.

Valor por defecto

Si le das al campo un default, asegúrate de que sea una función como el dict clase o una función que devuelve un objeto fresco cada vez. Utilizar incorrectamente un objeto mutable como default={} o default=[] crea un valor por defecto mutable compartido entre todas las instancias.

Índice

:clase:`~django.db.models.Index` y Field.db_index crean ambos un índice de B-tree, que no es particularmente útil cuando se consulta JSONField. Sólo en PostgreSQL puedes usar :clase:`~django.contrib.postgres.indexes.GinIndex` que es mejor adaptado.

Usuarios de PostgreSQL

PostgreSQL tiene dos tipos de datos JSON nativos: json y jsonb. La principal diferencia entre ellos es cómo se almacenan y cómo se pueden consultar. El campo json de PostgreSQL se almacena como la representación original en cadena del JSON y debe ser decodificado en el vuelo cuando se consulta basado en claves. El campo jsonb se almacena basado en la estructura real del JSON lo que permite el índice. La contrapartida es un pequeño costo adicional al escribir en el campo jsonb. JSONField utiliza jsonb.

Usuarios de Oracle

La base de datos Oracle no admite almacenar valores JSON escalares. Solo se admiten objetos y arreglos JSON (representados en Python usando :py:clase:`dict` y :py:clase:`list`) .

PositiveBigIntegerField

class PositiveBigIntegerField(**options)[fuente]

Como una :clase:`PositiveIntegerField`, pero solo permite valores bajo un punto determinado (dependiente de la base de datos). Los valores desde 0 a 9223372036854775807 son compatibles en todas las bases de datos admitidas por Django.

PositiveIntegerField

class PositiveIntegerField(**options)[fuente]

Como una :clase:`IntegerField`, pero debe ser positivo o cero (0). Solo se permiten valores bajo un punto determinado (dependiente de la base de datos). Los valores desde 0 a 2147483647 son compatibles en todas las bases de datos admitidas por Django. El valor 0 es aceptado por razones de compatibilidad hacia atrás.

Campo de Campo Entero Positivo

class PositiveSmallIntegerField(**options)[fuente]

Como un Campo de Campo Entero Positivo, pero solo permite valores por debajo de un cierto (punto dependiente del base de datos) punto. Los valores desde 0 a 32767 son compatibles en todas las bases de datos admitidas por Django.

CampoSlug

class SlugField(max_length=50, **options)[fuente]

Slug es un término periodístico. Un slug es una etiqueta corta para algo, que contiene solo letras, números, guiones bajos o guiones. Se utilizan generalmente en URLs.

Como un Campo de Caracteres, puedes especificar max_length (lee la nota sobre la portabilidad de la base de datos y max_length en esa sección también). Si no se especifica max_length, Django utilizará una longitud por defecto de 50.

Implica establecer Campo.db_index a True.

A menudo es útil prellenar automáticamente un Campo de Slug basado en el valor de alguna otra variable. Puedes hacer esto automáticamente en la administración utilizando prepopulated_fields.

Utiliza validate_slug o validate_unicode_slug para la validación.

SlugField.allow_unicode

Si True, el campo acepta letras Unicode además de las letras ASCII. Por defecto es False.

Campo de Campo Entero Pequeño

class SmallAutoField(**options)[fuente]

Como un Campo de Campo Entero, pero solo permite valores por debajo de un cierto (punto dependiente del base de datos) límite. Los valores desde 1 a 32767 son compatibles en todas las bases de datos admitidas por Django.

SmallIntegerField

class SmallIntegerField(**options)[fuente]

Como una IntegerField, pero solo permite valores por debajo de un cierto (punto dependiente del base de datos) punto. Los valores desde -32768 hasta 32767 son compatibles en todas las bases de datos soportadas por Django.

TextField

class TextField(**options)[fuente]

Un campo de texto grande. El widget de formulario predeterminado para este campo es un Textarea.

Si especificas el atributo max_length, se reflejará en el widget de formulario auto-generado Textarea. Sin embargo, no se aplica a nivel del modelo o base de datos. Utiliza un CharField para eso.

TextField.db_collation

Opcional. El nombre de collación de la base de datos del campo.

Nota

Los nombres de collación no están estandarizados. Como tal, esto no será portátil entre múltiples backends de bases de datos.

Oracle

Oracle no soporta collaciones para un TextField.

TimeField

class TimeField(auto_now=False, auto_now_add=False, **options)[fuente]

Una fecha y hora, representada en Python por una instancia de datetime.time. Acepta las mismas opciones de auto-población que DateField.

El widget de formulario predeterminado para este campo es un TimeInput. El admin agrega algunas atajos de JavaScript.

Campo de URL

class URLField(max_length=200, **options)[fuente]

Un CharField para una URL, validada por URLValidator.

El widget de formulario predeterminado para este campo es un URLInput.

Like todos los subclases de CharField, URLField acepta el argumento opcional max_length. Si no especificas max_length, se utiliza un valor por defecto de 200.

Campo UUID

class UUIDField(**options)[fuente]

Un campo para almacenar identificadores únicos universales. Utiliza la clase UUID de Python. Cuando se utiliza en PostgreSQL y MariaDB 10.7+, almacena en un uuid datatype, de lo contrario en un char(32).

Los identificadores únicos universales son una buena alternativa a AutoField para primary_key. La base de datos no generará el UUID por ti, por lo que se recomienda utilizar default:

import uuid
from django.db import models


class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # other fields

Ten en cuenta que se pasa un llamable (sin paréntesis) a default, no una instancia de UUID.

Consultas en PostgreSQL y MariaDB 10.7+

Las consultas con iexact, contains, icontains, startswith, istartswith, endswith o iendswith en PostgreSQL no funcionan para valores sin guiones, porque PostgreSQL y MariaDB 10.7+ los almacenan en un datatype de uuid con guiones.

Campos relacionales

Django también define un conjunto de campos que representan relaciones.

ForeignKey

class ForeignKey(to, on_delete, **options)[fuente]

Una relación muchos-a-uno. Requiere dos argumentos posicionales: la clase a la que el modelo está relacionado y la opción on_delete:

from django.db import models


class Manufacturer(models.Model):
    name = models.TextField()


class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)

La traducción de los textos es la siguiente:

Consulte ForeignKey.on_delete para obtener detalles sobre el segundo argumento posicional.

Se crea automáticamente un índice de base de datos en ForeignKey. Puedes deshabilitar esto estableciendo db_index a False. Es posible que desees evitar el overhead de un índice si estás creando una clave foránea para la consistencia más que para las uniones, o si crearás un índice alternativo como un índice parcial o múltiple.

Representación de base de datos

Detrás de escena, Django agrega "_id" al nombre del campo para crear su nombre de columna de la base de datos. En el ejemplo anterior, la tabla de la base de datos para el modelo Car tendrá una columna manufacturer_id. Puedes cambiar esto explícitamente especificando db_column, sin embargo, tu código nunca debería tener que tratar con el nombre de la columna de la base de datos (a menos que escribas SQL personalizado). Siempre manejarás los nombres de campo de tu objeto modelo.

Argumentos

ForeignKey acepta otros argumentos que definen los detalles sobre cómo funciona la relación.

ForeignKey.on_delete

Cuando un objeto referenciado por una ForeignKey se elimina, Django emulará el comportamiento de la restricción SQL especificada por el argumento on_delete. Por ejemplo, si tienes una clave foránea nula (ForeignKey) y quieres que sea establecida en null cuando el objeto referenciado se elimine:

user = models.ForeignKey(
    User,
    models.SET_NULL,
    blank=True,
    null=True,
)

on_delete no crea una restricción SQL en la base de datos. El soporte para opciones de cascada a nivel de base de datos puede implementarse más adelante.

Los valores posibles para on_delete se encuentran en django.db.models:

  • CASCADE[fuente]

    Borrado cascada. Django emula el comportamiento de la restricción SQL ON DELETE CASCADE y también elimina el objeto que contiene la relación ForeignKey.

    No se llama a Model.delete() en modelos relacionados, pero se envían los señales pre_delete y post_delete para todos los objetos eliminados.

  • PROTECT[fuente]

    Evita la eliminación del objeto referenciado elevando una excepción ProtectedError, una subclase de django.db.IntegrityError.

  • RESTRICT[fuente]

    Evita la eliminación del objeto referenciado elevando una excepción RestrictedError (subclase de django.db.IntegrityError). A diferencia de PROTECT, se permite la eliminación del objeto referenciado si también referencia un objeto diferente que está siendo eliminado en la misma operación, pero a través de una relación CASCADE.

    Considera este conjunto de modelos:

    class Artist(models.Model):
        name = models.CharField(max_length=10)
    
    
    class Album(models.Model):
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    
    
    class Song(models.Model):
        artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
        album = models.ForeignKey(Album, on_delete=models.RESTRICT)
    

    Puedes eliminar Artist incluso si eso implica eliminar un Album que es referenciado por una Song, porque Song también referencia Artist mismo a través de una relación cascada. Por ejemplo:

    >>> artist_one = Artist.objects.create(name="artist one")
    >>> artist_two = Artist.objects.create(name="artist two")
    >>> album_one = Album.objects.create(artist=artist_one)
    >>> album_two = Album.objects.create(artist=artist_two)
    >>> song_one = Song.objects.create(artist=artist_one, album=album_one)
    >>> song_two = Song.objects.create(artist=artist_one, album=album_two)
    >>> album_one.delete()
    # Raises RestrictedError.
    >>> artist_two.delete()
    # Raises RestrictedError.
    >>> artist_one.delete()
    (4, {'Song': 2, 'Album': 1, 'Artist': 1})
    
  • SET_NULL[fuente]

    Establece la relación ForeignKey como nulo; esto solo es posible si null es True.

  • SET_DEFAULT[fuente]

    Establece la relación ForeignKey en su valor por defecto; debe haber establecido un valor por defecto para la relación ForeignKey.

  • SET()[fuente]

    Establece la relación ForeignKey en el valor pasado a SET(), o si se pasa una función, el resultado de llamarla. En la mayoría de los casos, pasar una función será necesario para evitar ejecutar consultas en el momento que tu models.py es importado:

    from django.conf import settings
    from django.contrib.auth import get_user_model
    from django.db import models
    
    
    def get_sentinel_user():
        return get_user_model().objects.get_or_create(username="deleted")[0]
    
    
    class MyModel(models.Model):
        user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.SET(get_sentinel_user),
        )
    
  • DO_NOTHING[fuente]

    No toma ninguna acción. Si tu motor de base de datos impone integridad referencial, esto causará un IntegrityError a menos que agregues manualmente una restricción SQL ON DELETE al campo de la base de datos.

ForeignKey.limit_choices_to

Sets a limit a las opciones disponibles para este campo cuando se renderiza utilizando un ModelForm o la interfaz de administración (por defecto, todos los objetos en el conjunto de resultados están disponibles para elegir). Se puede utilizar un diccionario, un objeto Q o una función llamable que devuelve un diccionario o un objeto Q.

Por ejemplo:

staff_member = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    limit_choices_to={"is_staff": True},
)

Causa que el campo correspondiente en el ModelForm liste solo instancias de User con is_staff=True. Esto puede ser útil en la interfaz de administración de Django.

La forma llamable puede resultar útil, por ejemplo, cuando se utiliza conjuntamente con el módulo Python datetime para limitar las selecciones por rango de fecha. Por ejemplo:

def limit_pub_date_choices():
    return {"pub_date__lte": datetime.date.today()}


limit_choices_to = limit_pub_date_choices

Si limit_choices_to es o devuelve un objeto Q, lo que puede ser útil para consultas complejas, entonces solo tendrá efecto en las opciones disponibles en la interfaz de administración cuando el campo no esté incluido en raw_id_fields en el ModelAdmin del modelo.

Nota

Si se utiliza una función llamable para limit_choices_to, se invocará cada vez que se instancie un nuevo formulario. También puede ser invocado cuando se valide un modelo, por ejemplo mediante comandos de gestión o la interfaz de administración. La interfaz de administración construye conjuntos de resultados para validar los datos de entrada en varios casos de borde, por lo que existe la posibilidad de que tu función llamable sea invocada varias veces.

ForeignKey.related_name

El nombre a utilizar para la relación desde el objeto relacionado hacia este uno. También es el valor predeterminado para related_query_name (el nombre del filtro inverso a usar en el modelo objetivo). Consulta la documentación sobre objetos relacionados <backwards-related-objects> para una explicación completa y ejemplo. Ten en cuenta que debes establecer este valor cuando definas relaciones en modelos abstractos; y cuando lo hagas, se dispone de un sintaxis especial <abstract-related-name>.

Si prefieres que Django no cree una relación inversa, establece related_name en '+' o acábalo con '+'. Por ejemplo, esto asegurará que el modelo User no tenga una relación inversa hacia este modelo:

user = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    related_name="+",
)
ForeignKey.related_query_name

El nombre a utilizar para el filtro inverso del modelo objetivo. Por defecto, es el valor de related_name o default_related_name si está establecido; en caso contrario, es el nombre del modelo:

# Declare the ForeignKey with related_query_name
class Tag(models.Model):
    article = models.ForeignKey(
        Article,
        on_delete=models.CASCADE,
        related_name="tags",
        related_query_name="tag",
    )
    name = models.CharField(max_length=255)


# That's now the name of the reverse filter
Article.objects.filter(tag__name="important")

Como related_name, related_query_name admite etiquetas de aplicación y interpolación de clase mediante un sintaxis especial <abstract-related-name>.

ForeignKey.to_field

El campo en el objeto relacionado que la relación está dirigida a. Por defecto, Django utiliza la clave primaria del objeto relacionado. Si se referencia un campo diferente, ese campo debe tener unique=True.

ForeignKey.db_constraint

Controla si se debe crear una restricción en la base de datos para esta clave externa. El valor por defecto es True, y probablemente sea lo que desees; establecerlo en False puede ser muy perjudicial para la integridad de los datos. Dicho esto, aquí hay algunos escenarios donde podrías querer hacer esto:

  • Tienes datos legados que no son válidos.

  • Estás descomponiendo tu base de datos.

Si se establece en False, acceder a un objeto relacionado que no existe levantará la excepción DoesNotExist.

ForeignKey.swappable

Controla la reacción del marco de migración si este ForeignKey está apuntando a un modelo intercambiable. Si es True, lo que es el valor por defecto, entonces si el ForeignKey está apuntando a un modelo que coincide con el valor actual de settings.AUTH_USER_MODEL (o otra configuración de modelo intercambiable) la relación se almacenará en la migración utilizando una referencia a la configuración, no al modelo directamente.

Sólo deseas sobreescribir esto para ser False si estás seguro de que tu modelo debe apuntar siempre hacia el modelo intercambiado - por ejemplo, si es un modelo de perfil diseñado específicamente para tu modelo de usuario personalizado.

Establecerlo en False no significa que puedas referenciar un modelo intercambiable incluso si está intercambiado - False significa que las migraciones realizadas con este ForeignKey siempre se referirán al modelo exacto que especificas (por lo tanto, fallará de manera dura si el usuario intenta ejecutarlo con un modelo User que no soportes, por ejemplo).

Si tienes alguna duda, déjalo en su valor por defecto de True.

ManyToManyField

class ManyToManyField(to, **options)[fuente]

Una relación muchos-a-muchos. Requiere un argumento posicional: la clase a la que está relacionada el modelo, que funciona exactamente igual que lo hace para ForeignKey, incluyendo relaciones recursivas y relajadas.

Los objetos relacionados pueden ser agregados, eliminados o creados con el campo de RelatedManager.

Representación de base de datos

Detrás de escena, Django crea una tabla de unión intermedia para representar la relación muchos-a-muchos. Por defecto, el nombre de esta tabla se genera utilizando el nombre del campo muchos-a-muchos y el nombre de la tabla del modelo que lo contiene. Dado que algunas bases de datos no admiten nombres de tabla por encima de una cierta longitud, estos nombres de tabla serán automáticamente truncados y se utilizará un hash de unicidad, por ejemplo author_books_9cdf. Puedes proporcionar manualmente el nombre de la tabla de unión utilizando la opción db_table.

Argumentos

ManyToManyField acepta un conjunto adicional de argumentos – todos opcionales – que controlan cómo funciona la relación.

ManyToManyField.related_name

Igual que ForeignKey.related_name.

ManyToManyField.related_query_name

Igual que ForeignKey.related_query_name.

ManyToManyField.limit_choices_to

Igual que ForeignKey.limit_choices_to.

ManyToManyField.symmetrical

Solo se utiliza en la definición de ManyToManyFields en self. Considera el siguiente modelo:

from django.db import models


class Person(models.Model):
    friends = models.ManyToManyField("self")

Cuando Django procesa este modelo, identifica que tiene un campo ManyToManyField en sí mismo y como resultado no agrega una atributo person_set a la clase Person. En su lugar, se asume que el campo ManyToManyField es simétrico – es decir, si eres amigo mío, entonces tú eres mi amigo.

Si no deseas la simetría en las relaciones muchos-a-muchos con self, establece symmetrical a False. Esto obligará a Django a agregar el descriptor para la relación inversa, permitiendo que las relaciones de campo ManyToManyField sean asimétricas.

ManyToManyField.through

Django generará automáticamente una tabla para gestionar las relaciones muchos-a-muchos. Sin embargo, si deseas especificar manualmente la tabla intermedia, puedes utilizar la opción through para especificar el modelo de Django que representa la tabla intermedia que deseas usar.

El through model puede ser especificado utilizando directamente la clase del modelo o una referencia relación perezosa a la clase del modelo.

La utilización más común de esta opción es cuando deseas asociar datos adicionales con una relación muchos-a-muchos.

Nota

Las relaciones recursivas utilizando un modelo intermediario no pueden determinar los nombres de los accesoadores inversos, ya que serían los mismos. Necesitas establecer al menos uno de ellos en related_name. Si prefieres que Django no cree una relación hacia atrás, establece related_name en '+'.

Orden de las claves foráneas en modelos intermediarios

Cuando defines una relación muchos-a-muchos asimétrica desde un modelo a sí mismo utilizando un modelo intermediario sin definir through_fields, la primera clave foránea en el modelo intermediario se tratará como representante del lado de origen de la ManyToManyField, y la segunda como el lado objetivo. Por ejemplo:

from django.db import models


class Manufacturer(models.Model):
    name = models.CharField(max_length=255)
    clients = models.ManyToManyField(
        "self", symmetrical=False, related_name="suppliers", through="Supply"
    )


class Supply(models.Model):
    supplier = models.ForeignKey(
        Manufacturer, models.CASCADE, related_name="supplies_given"
    )
    client = models.ForeignKey(
        Manufacturer, models.CASCADE, related_name="supplies_received"
    )
    product = models.CharField(max_length=255)

Aquí, el modelo Manufacturer define la relación muchos-a-muchos con clients en su papel como proveedor. Por lo tanto, la clave foránea supplier (el origen) debe venir antes de la clave foránea client (el objetivo) en el modelo intermediario Supply.

Especificar through_fields=("supplier", "client") en la ManyToManyField hace irrelevante el orden de las claves foráneas en el modelo through.

Si no especificas un modelo through explícito, todavía hay un modelo through implícito que puedes utilizar para acceder directamente a la tabla creada para mantener la asociación. Tiene tres campos para vincular los modelos, una clave primaria y dos claves foráneas. Hay una restricción única en las dos claves foráneas.

Si los modelos de origen y destino difieren, se generan los siguientes campos:

  • id: la clave primaria de la relación.

  • <contenedor_modelo>_id: el id del modelo que declara el campo ManyToManyField.

  • <otro_modelo>_id: el id del modelo al que apunta el campo ManyToManyField.

Si el campo ManyToManyField apunta desde y hacia el mismo modelo, se generan los siguientes campos:

  • id: la clave primaria de la relación.

  • desde_<modelo>_id: el id de la instancia que apunta al modelo (es decir, la instancia fuente).

  • hacia_<modelo>_id: el id de la instancia a la que se apunta la relación (es decir, la instancia destino).

Esta clase se puede utilizar para consultar registros asociados para una instancia del modelo como un modelo normal:

Model.m2mfield.through.objects.all()
ManyToManyField.through_fields

Solo se utiliza cuando se especifica un modelo intermedio personalizado. Django determinará normalmente qué campos del modelo intermedio usar para establecer la relación muchos a muchos de manera automática. Sin embargo, considere los siguientes modelos:

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=50)


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(
        Person,
        through="Membership",
        through_fields=("group", "person"),
    )


class Membership(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    inviter = models.ForeignKey(
        Person,
        on_delete=models.CASCADE,
        related_name="membership_invites",
    )
    invite_reason = models.CharField(max_length=64)

Membership tiene dos claves foráneas con Person (person y inviter), lo que hace que la relación sea ambigua y Django no pueda saber cuál usar. En este caso, debes especificar explícitamente cuáles de las claves foráneas utilizar utilizando through_fields, como en el ejemplo anterior.

through_fields acepta una tupla de 2 elementos ('field1', 'field2'), donde field1 es el nombre de la clave foránea al modelo en el que se define el campo ManyToManyField (group en este caso), y field2 el nombre de la clave foránea al modelo destino (person en este caso).

Cuando tienes más de una clave foránea en un modelo intermedio con cualquier (o incluso ambos) de los modelos que participan en una relación muchos a muchos, debes especificar through_fields. Esto también se aplica a las relaciones recursivas <recursive-relationships> cuando se utiliza un modelo intermedio y hay más de dos claves foráneas al modelo o quieres especificar explícitamente cuáles usar Django.

ManyToManyField.db_table

El nombre de la tabla para crear para almacenar los datos many-to-many. Si no se proporciona, Django asumirá un nombre por defecto basado en los nombres de: la tabla del modelo que define la relación y el nombre del campo mismo.

ManyToManyField.db_constraint

Controla si deben crearse restricciones en la base de datos para las claves foráneas en la tabla intermedia. El valor predeterminado es True, y probablemente sea lo que quieras; establecerlo en False puede ser muy malo para la integridad de los datos. Dicho esto, aquí hay algunos escenarios donde podrías querer hacer esto:

  • Tienes datos legados que no son válidos.

  • Estás descomponiendo tu base de datos.

Es un error pasar tanto db_constraint como through.

ManyToManyField.swappable

Controla la reacción del marco de migración si este campo ManyToManyField está apuntando a un modelo intercambiable. Si es True - el valor predeterminado - entonces, si el campo ManyToManyField está apuntando a un modelo que coincide con el valor actual de settings.AUTH_USER_MODEL (o otra configuración de modelo intercambiable) la relación se almacenará en la migración utilizando una referencia a la configuración, no al modelo directamente.

Sólo deseas sobreescribir esto para ser False si estás seguro de que tu modelo debe apuntar siempre hacia el modelo intercambiado - por ejemplo, si es un modelo de perfil diseñado específicamente para tu modelo de usuario personalizado.

Si tienes alguna duda, déjalo en su valor por defecto de True.

El campo ManyToManyField no admite validators.

null no tiene efecto ya que no hay forma de requerir una relación en el nivel de base de datos.

OneToOneField

class OneToOneField(to, on_delete, parent_link=False, **options)[fuente]

Una relación uno a uno. Conceptualmente, esto es similar a un ForeignKey con unique=True, pero el «lado inverso» de la relación devolverá directamente un objeto único.

Esto es más útil como clave primaria de un modelo que «extiende» otro modelo de alguna manera; se implementa la herencia multi-tabla agregando una relación uno a uno implícita desde el modelo hijo al modelo padre, por ejemplo.

Se requiere un argumento posicional: la clase a la que el modelo estará relacionado. Esto funciona exactamente igual que para ForeignKey, incluyendo todas las opciones respecto a relaciones recursivas <recursive-relationships>` y relaciones perezosas <lazy-relationships>`.

Si no especificas el argumento :attr:`~ForeignKey.related_name para el campo OneToOneField, Django utilizará como valor por defecto el nombre en minúsculas del modelo actual.

Con el siguiente ejemplo:

from django.conf import settings
from django.db import models


class MySpecialUser(models.Model):
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
    )
    supervisor = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="supervisor_of",
    )

Tu modelo User resultante tendrá las siguientes atributos:

>>> user = User.objects.get(pk=1)
>>> hasattr(user, "myspecialuser")
True
>>> hasattr(user, "supervisor_of")
True

Se levanta una excepción RelatedObjectDoesNotExist al acceder a la relación inversa si no existe un registro en la tabla relacionada. Esto es una subclase de la excepción Model.DoesNotExist del modelo objetivo y se puede acceder como atributo del acceso inverso. Por ejemplo, si un usuario no tiene un supervisor designado por MySpecialUser:

try:
    user.supervisor_of
except User.supervisor_of.RelatedObjectDoesNotExist:
    pass

Además, OneToOneField acepta todos los argumentos extra aceptados por ForeignKey, más uno extra:

Cuando es True y se utiliza en un modelo que hereda de otra clase de modelo concreto, indica que este campo debe usarse como el enlace hacia la clase padre, en lugar del campo adicional OneToOneField que normalmente se crearía implícitamente al heredar.

Consultar Relaciones uno a uno para ejemplos de uso de OneToOneField.

Relaciones perezosas

Las relaciones perezosas permiten referenciar modelos por sus nombres (como cadenas) o crear relaciones recursivas. Las cadenas se pueden utilizar como primer argumento en cualquier campo de relación para referenciar modelos de manera perezosa. Una referencia perezosa puede ser recursiva, relativa o absoluta.

Relaciones recursivas

Para definir una relación donde un modelo se refiere a sí mismo, utiliza "self" como primer argumento del campo de la relación:

from django.db import models


class Manufacturer(models.Model):
    name = models.TextField()
    suppliers = models.ManyToManyField("self", symmetrical=False)

Cuando se utiliza en un modelo abstracto (Clases base abstractas), la relación recursiva resuelve tal que cada subclase concreta se refiere a sí misma.

Relativo

Cuando una relación necesita ser creada con un modelo que aún no ha sido definido, puede ser referenciado por su nombre en lugar del objeto de modelo mismo:

from django.db import models


class Car(models.Model):
    manufacturer = models.ForeignKey(
        "Manufacturer",
        on_delete=models.CASCADE,
    )


class Manufacturer(models.Model):
    name = models.TextField()
    suppliers = models.ManyToManyField("self", symmetrical=False)

Las relaciones definidas de esta manera en modelos abstractos (Clases base abstractas) se resuelven cuando el modelo es heredado como un modelo concreto y no son relativas al app_label del modelo abstracto:

products/models.py
from django.db import models


class AbstractCar(models.Model):
    manufacturer = models.ForeignKey("Manufacturer", on_delete=models.CASCADE)

    class Meta:
        abstract = True
production/models.py
from django.db import models
from products.models import AbstractCar


class Manufacturer(models.Model):
    name = models.TextField()


class Car(AbstractCar):
    pass

En este ejemplo, la relación Car.manufacturer se resolverá a production.Manufacturer, ya que apunta al modelo concreto definido dentro del archivo production/models.py.

Modelos reutilizables con referencias relativas

Las referencias relativas permiten la creación de modelos abstractos reutilizables con relaciones que pueden resolver a diferentes implementaciones de los modelos referenciados en diversas subclases y aplicaciones.

Absolute

Referencias absolutas especifican un modelo utilizando su app_label y nombre de clase, lo que permite referenciar modelos en diferentes aplicaciones. Este tipo de relación relajada también puede ayudar a resolver importaciones circulares.

Por ejemplo, si el modelo Manufacturer está definido en otra aplicación llamada thirdpartyapp, se puede referenciar como:

class Car(models.Model):
    manufacturer = models.ForeignKey(
        "thirdpartyapp.Manufacturer",
        on_delete=models.CASCADE,
    )

Las referencias absolutas siempre apuntan al mismo modelo, incluso cuando se utilizan en un modelo abstracto: abstract model.

Referencia de la API del campo

class Field[fuente]

Field es una clase abstracta que representa una columna de tabla de base de datos. Django utiliza campos para crear la tabla de base de datos (db_type()), para mapear tipos de Python a base de datos (get_prep_value()) y viceversa (from_db_value()).

Un campo es así una pieza fundamental en diferentes APIs de Django, especialmente models y querysets.

En modelos, un campo se instancia como atributo de clase y representa una columna de tabla particular, véase Modelos. Tiene atributos como null y unique, y métodos que Django utiliza para mapear el valor del campo a valores específicos de la base de datos.

Un Field es una subclase de RegisterLookupMixin y así tanto Transform como Lookup pueden registrarse en él para ser utilizados en QuerySets (por ejemplo, field_name__exact="foo"). Todos los lookups integrados están registrados por defecto.

Todos los campos de Django integrados, como CharField, son implementaciones particulares de Field. Si necesita un campo personalizado, puede heredar cualquier uno de los campos integrados o escribir un Field desde cero. En cualquiera de los casos, véase Cómo crear campos de modelo personalizados.

description

Una descripción detallada del campo, por ejemplo para la aplicación django.contrib.admindocs.

La descripción puede tener la forma:

description = _("String (up to %(max_length)s)")

donde los argumentos se interpolan desde el diccionario del campo __dict__.

descriptor_class

Una clase que implementa el protocolo de descriptor descriptor protocol y es instanciada y asignada a la atributo de instancia del modelo. El constructor debe aceptar un solo argumento, la instancia del campo. Sobrescribiendo esta clase permite personalizar el comportamiento get y set.

Para mapear un Field a un tipo específico de base de datos, Django expone varias métodos:

get_internal_type()[fuente]

Devuelve una cadena que nombra este campo para fines específicos del backend. Por defecto devuelve el nombre de la clase.

Consulte Emulando tipos de campos integrados para su uso en campos personalizados.

db_type(connection)[fuente]

Devuelve el tipo de dato de columna de base de datos para el Field, teniendo en cuenta la connection.

Consulte Tipos de base de datos personalizados para su uso en campos personalizados.

rel_db_type(connection)[fuente]

Devuelve el tipo de dato de columna de base de datos para campos como ForeignKey y OneToOneField que apuntan al Field, teniendo en cuenta la connection.

Consulte Tipos de base de datos personalizados para su uso en campos personalizados.

Hay tres situaciones principales en las que Django necesita interactuar con el backend de la base de datos y los campos:

  • cuando consulta la base de datos (valor Python -> valor del backend de la base de datos)

  • cuando carga datos desde la base de datos (valor del backend de la base de datos -> valor Python)

  • cuando guarda en la base de de datos (valor Python -> valor del backend de la base de datos)

Al consultar, se utilizan get_db_prep_value() y get_prep_value():

get_prep_value(value)[fuente]

value es el valor actual de la atributo del modelo, y el método debe devolver los datos en un formato que ha sido preparado para su uso como parámetro en una consulta.

Consulte Conversión de objetos Python a valores de consulta para su uso.

get_db_prep_value(value, connection, prepared=False)[fuente]

Convierte value a un valor específico del backend. Por defecto devuelve value si prepared=True y get_prep_value() si es False.

Consulte Convierte los valores de consulta a valores de base de datos para su uso.

Al cargar datos, se utiliza from_db_value():

from_db_value(value, expression, connection)

Los textos traducidos son:

Este método no se utiliza para la mayoría de los campos integrados ya que la base de datos devuelve el tipo correcto de Python o el backend realiza la conversión.

expression es lo mismo que self.

Consulte Conversión de valores a objetos Python para su uso.

Nota

Por razones de rendimiento, from_db_value no está implementado como un no-op en campos que no lo requieren (todos los campos de Django). Por lo tanto, no debes llamar a super en tu definición.

Al guardar, se utilizan pre_save() y get_db_prep_save():

get_db_prep_save(value, connection)[fuente]

Igual que el get_db_prep_value(), pero llamado cuando el valor del campo debe ser guardado en la base de datos. Por defecto devuelve get_db_prep_value().

pre_save(model_instance, add)[fuente]

Método llamado antes de get_db_prep_save() para preparar el valor antes de guardarlo (por ejemplo, para DateField.auto_now).

model_instance es la instancia a la que pertenece este campo y add es si la instancia se está guardando en la base de datos por primera vez.

Debería devolver el valor del atributo apropiado de model_instance para este campo. El nombre del atributo está en self.attname (esto se configura mediante Field).

Consulte Preprocesamiento de valores antes de guardar para su uso.

Los campos a menudo reciben sus valores como un tipo diferente, ya sea desde la serialización o desde los formularios.

to_python(value)[fuente]

Convierte el valor en el objeto Python correcto. Actúa como el reverso de value_to_string(), y también se llama en clean().

Consulte Conversión de valores a objetos Python para su uso.

Además de guardar en la base de datos, el campo también necesita saber cómo serializar su valor:

value_from_object(obj)[fuente]

Returns the field’s value for the given model instance.

Esta función es a menudo utilizada por value_to_string().

value_to_string(obj)[fuente]

Convierte obj a una cadena. Utilizado para serializar el valor del campo.

Consulte Conversión de datos de campos para serialización para su uso.

Cuando se utiliza model forms, el Field necesita saber qué campo de formulario debe representar:

formfield(form_class=None, choices_form_class=None, **kwargs)[fuente]

Returns the default django.forms.Field of this field for ModelForm.

Si formfield() está sobrescrito para devolver None, este campo se excluye del ModelForm.

Por defecto, si tanto form_class como choices_form_class son None, utiliza CharField. Si el campo tiene choices y no se especifica choices_form_class, utiliza TypedChoiceField.

Consulte Especificar el campo de formulario para un campo de modelo para su uso.

deconstruct()[fuente]

Devuelve una tupla de 4 elementos con suficiente información para recrear el campo:

  1. El nombre del campo en el modelo.

  2. La ruta de importación del campo (por ejemplo, "django.db.models.IntegerField"). Esta debe ser la versión más portable, por lo que puede ser mejor una versión menos específica.

  3. Una lista de argumentos posicionales.

  4. Un diccionario de argumentos clave.

Este método debe agregarse a los campos antes de 1.7 para migrar sus datos utilizando Migraciones.

Registro y recuperación de lookups

Field implementa la API de registro de lookups API de registro. La API se puede utilizar para personalizar qué lookups están disponibles para una clase de campos y sus instancias, y cómo se recuperan los lookups de un campo.

Field attribute reference

Cada instancia de Field contiene varias atributos que permiten introspeccionar su comportamiento. Utiliza estos atributos en lugar de comprobaciones con isinstance cuando necesites escribir código que dependa de la funcionalidad de un campo. Estos atributos se pueden utilizar junto con la API Model._meta para limitar una búsqueda a tipos específicos de campos. Los campos de modelos personalizados deben implementar estas banderas.

Atributos para campos

Field.auto_created

Bandera booleana que indica si el campo se creó automáticamente, como el OneToOneField utilizado por la herencia de modelos.

Field.concrete

Bandera booleana que indica si el campo tiene una columna de base de datos asociada con él.

Field.hidden

Bandera booleana que indica si un campo está oculto y no debe ser devuelto por defecto por Options.get_fields(). Un ejemplo es el campo inverso para una ForeignKey con un related_name que comienza con '+'.

Field.is_relation

Bandera booleana que indica si un campo contiene referencias a uno o más modelos para su funcionalidad (por ejemplo, ForeignKey, ManyToManyField, OneToOneField, etc.).

Field.model

Devuelve el modelo en el que se define el campo. Si un campo está definido en una superclase de un modelo, model se referirá a la superclase, no a la clase del objeto.

Atributos para campos con relaciones

Estos atributos se utilizan para consultar la cardinalidad y otros detalles de una relación. Estos atributos están presentes en todos los campos; sin embargo, solo tendrán valores booleanos (en lugar de None) si el campo es un tipo de relación (Field.is_relation=True).

Field.many_to_many

Boolean bandera que es True si el campo tiene una relación muchos-a-muchos; False en caso contrario. El único campo incluido con Django donde esto es True es ManyToManyField.

Field.many_to_one

Bandera booleana que es True si el campo tiene una relación muchos-a-uno, como una ForeignKey; False en caso contrario.

Field.one_to_many

Bandera booleana que es True si el campo tiene una relación uno-a-muchos, como una GenericRelation o la inversa de una ForeignKey; False en caso contrario.

Field.one_to_one

Bandera booleana que es True si el campo tiene una relación uno-a-uno, como un OneToOneField; False en caso contrario.

Field.related_model

Puntúa al modelo al que se relaciona el campo. Por ejemplo, Author en ForeignKey(Author, on_delete=models.CASCADE). El related_model para una GenericForeignKey es siempre None.