Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

iTechGuides is reader-supported. When you buy through links on our site, we may earn an affiliate commission. As an Amazon Associate I earn from qualifying purchases. Learn more

Una PRIMARY KEY identifica una fila; UNIQUE impide que se repita un valor o combinación de valores; y una FOREIGN KEY comprueba que una referencia apunte a una fila válida. En Django, esas ideas se expresan con primary_key=True, unique=True y ForeignKey, respectivamente. Aunque están relacionadas, no son intercambiables: cada una protege una regla distinta.

Qué hace cada restricción

Restricción Qué garantiza ¿Identifica o relaciona? En Django
PRIMARY KEY Valores únicos y no nulos para una columna o un conjunto de columnas Identifica filas primary_key=True
UNIQUE Que no se repita un valor o una combinación de valores Protege una regla de unicidad; no designa por sí sola la identidad principal de la fila unique=True en un campo; también hay restricciones de modelo para casos compuestos
FOREIGN KEY Que un valor referenciante corresponda a un valor permitido en la tabla destino Relaciona filas entre tablas ForeignKey(ModeloDestino, on_delete=...)

En PostgreSQL 18, una tabla puede tener como máximo una clave primaria, que puede incluir una o varias columnas. PostgreSQL crea automáticamente un índice único para respaldarla. Una tabla sí puede tener varias restricciones UNIQUE. Para una clave foránea, PostgreSQL exige que las columnas referenciadas estén respaldadas por una clave primaria, una restricción única o un índice único no parcial. Documentación de restricciones de PostgreSQL.

Primary key: la identidad de la fila

Una clave primaria marca qué columna —o conjunto de columnas— permite identificar de manera inequívoca cada fila. Sus valores no pueden repetirse ni ser NULL. Por ejemplo, producto_id puede identificar cada producto aunque el nombre o el código visible cambien.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

La clave primaria también puede ser compuesta: la identidad depende entonces de la combinación de columnas, no de cada valor aislado. En PostgreSQL, la regla sigue siendo una clave primaria por tabla, aunque abarque varias columnas.

UNIQUE: una regla contra duplicados

UNIQUE sirve para una regla de negocio que prohíbe duplicados, como un código de producto. No convierte automáticamente la columna en la identidad principal de la fila: una tabla puede tener varias reglas UNIQUE, pero solo una clave primaria en PostgreSQL.

No asumas que UNIQUE significa «obligatorio». Si el campo debe tener un valor, declara también una regla de no nulidad. El tratamiento de valores NULL en restricciones únicas depende del motor de base de datos y, en algunos casos, de su configuración.

Foreign key: una referencia válida

Una clave foránea impide que una fila apunte a un registro inexistente, según las reglas del motor. No impide por sí misma que varias filas de la tabla de origen apunten al mismo registro: por eso, una relación de muchos a uno puede tener muchas filas que referencien el mismo producto.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Si una relación debe ser obligatoria, la columna necesita además una regla de no nulidad. Una clave foránea nullable puede quedar sin referencia; la restricción de referencia no equivale a exigir que el campo siempre tenga un valor.

Ejemplo SQL: productos y pedidos

CREATE TABLE productos (
    producto_id integer PRIMARY KEY,
    codigo text UNIQUE NOT NULL
);

CREATE TABLE pedidos (
    pedido_id integer PRIMARY KEY,
    producto_id integer REFERENCES productos (producto_id)
);
  • productos.producto_id identifica cada producto y no admite duplicados ni valores nulos.
  • productos.codigo no puede repetirse. En este ejemplo, NOT NULL se declara por separado porque UNIQUE no expresa por sí solo que el campo sea obligatorio.
  • pedidos.producto_id debe referenciar un producto existente, pero puede quedar sin valor mientras la columna admita NULL. Para exigir una referencia, habría que declarar también NOT NULL.

Cómo se expresan estas reglas en Django

from django.db import models

class Producto(models.Model):
    codigo = models.CharField(max_length=40, unique=True)

class Pedido(models.Model):
    producto = models.ForeignKey(Producto, on_delete=models.PROTECT)

En este ejemplo, codigo debe ser único. producto representa una relación muchos-a-uno y, de forma predeterminada, Django suele crear para ella una columna llamada producto_id y un índice. PROTECT ilustra una elección explícita para el borrado; la opción adecuada depende de las reglas de la aplicación y de qué debe pasar con los pedidos si se intenta borrar un producto.

Por qué Django añade un campo id

Si un modelo no define una clave primaria, Django agrega una automáticamente. Si necesitas elegir otro campo como identidad, puedes marcarlo con primary_key=True. Django documenta que esa opción implica null=False y unique=True, y que solo un campo puede marcarse así. En Django 5.2, las claves primarias compuestas se declaran con CompositePrimaryKey. Consulta la referencia oficial de campos de modelo de Django 5.2.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Qué significa on_delete en Django

El argumento on_delete determina cómo Django emula la conducta elegida cuando se borran objetos mediante sus operaciones. No crea por sí mismo una cláusula SQL ON DELETE en la base de datos. Por eso, on_delete=models.CASCADE no demuestra que el motor tenga configurado SQL ON DELETE CASCADE; son comportamientos que conviene distinguir al diseñar borrados y evaluar operaciones realizadas fuera del ORM.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.