Ir al contenido principal

Manejo de Relaciones Uno a Muchos en Django

Manejo de Relaciones Uno a Muchos en Django

En este post, exploraremos cómo manejar relaciones uno a muchos en Django utilizando modelos, formularios y vistas. Tomaremos como ejemplo dos modelos: Cliente y ClientesActividades, donde un cliente puede tener múltiples actividades asociadas.

1. Definición de los Modelos

Comenzamos definiendo los modelos en Django. El modelo Cliente representa a un cliente, mientras que ClientesActividades almacena las actividades relacionadas con cada cliente. Usamos una clave foránea (ForeignKey) para establecer la relación.


from django.db import models

class Cliente(models.Model):
    cedula = models.CharField(max_length=20)
    nombre = models.CharField(max_length=100)
    apellido = models.CharField(max_length=100)
    timbrado = models.CharField(max_length=50, blank=True, null=True)
    celular = models.CharField(max_length=20, blank=True, null=True)
    email = models.CharField(max_length=100, blank=True, null=True)
    direccion = models.CharField(max_length=200, blank=True, null=True)

    class Meta:
        db_table = 'clientes'

    def __str__(self):
        return f"{self.nombre} {self.apellido}"


class ClientesActividades(models.Model):
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, related_name='actividades')
    actividad = models.IntegerField(blank=True, null=True)

    class Meta:
        db_table = 'clientes_actividades'

    def __str__(self):
        return f"Actividad {self.actividad} de {self.cliente.nombre}"
        

2. Creación de Formularios

Para manejar la creación y edición de clientes junto con sus actividades, utilizamos formularios y un inlineformset_factory. Esto nos permite gestionar múltiples actividades relacionadas con un cliente en un solo formulario.


from django import forms
from .models import Cliente, ClientesActividades
from django.forms import inlineformset_factory

class ClienteForm(forms.ModelForm):
    class Meta:
        model = Cliente
        fields = ['cedula', 'nombre', 'apellido', 'timbrado', 'celular', 'email', 'direccion']


class ClientesActividadesForm(forms.ModelForm):
    class Meta:
        model = ClientesActividades
        fields = ['actividad']


# Creamos un formset para las actividades
ClientesActividadesFormSet = inlineformset_factory(
    Cliente,  # Modelo principal
    ClientesActividades,  # Modelo relacionado
    form=ClientesActividadesForm,  # Formulario para el modelo relacionado
    extra=1,  # Número de formularios vacíos que se muestran por defecto
    can_delete=True  # Permite eliminar actividades
)
        

3. Vistas para Crear y Editar Clientes

Las vistas manejan la lógica para crear y editar clientes junto con sus actividades. Usamos el formset para gestionar las actividades relacionadas.


from django.shortcuts import render, redirect, get_object_or_404
from .models import Cliente, ClientesActividades
from .forms import ClienteForm, ClientesActividadesFormSet

def crear_cliente(request):
    if request.method == 'POST':
        form = ClienteForm(request.POST)
        formset = ClientesActividadesFormSet(request.POST)
        if form.is_valid() and formset.is_valid():
            cliente = form.save()  # Guarda el cliente
            formset.instance = cliente  # Asocia el formset con el cliente
            formset.save()  # Guarda las actividades relacionadas
            return redirect('lista_clientes')  # Redirige a la lista de clientes
    else:
        form = ClienteForm()
        formset = ClientesActividadesFormSet()
    return render(request, 'crear_cliente.html', {'form': form, 'formset': formset})


def editar_cliente(request, cliente_id):
    cliente = get_object_or_404(Cliente, id=cliente_id)
    if request.method == 'POST':
        form = ClienteForm(request.POST, instance=cliente)
        formset = ClientesActividadesFormSet(request.POST, instance=cliente)
        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()
            return redirect('lista_clientes')
    else:
        form = ClienteForm(instance=cliente)
        formset = ClientesActividadesFormSet(instance=cliente)
    return render(request, 'editar_cliente.html', {'form': form, 'formset': formset})
        

4. Plantillas

Las plantillas muestran los formularios para crear y editar clientes, así como la lista de clientes.


<!-- crear_cliente.html -->
<form method="post">
    {% csrf_token %}
    {{ form.as_p }}  <!-- Formulario del cliente -->
    <h3>Actividades</h3>
    {{ formset.management_form }}  <!-- Gestión del formset -->
    {% for form in formset %}
        <div class="actividad-form">
            {{ form.as_p }}  <!-- Formulario de cada actividad -->
        </div>
    {% endfor %}
    <button type="submit">Guardar</button>
</form>
        

Conclusión

Este enfoque permite manejar relaciones uno a muchos en Django de manera eficiente, utilizando formularios y vistas para gestionar tanto el modelo principal como los modelos relacionados. Es una técnica útil para aplicaciones que requieren la gestión de datos complejos.

Comentarios

Entradas populares de este blog

Instalación y Configuración de MySQL 5.7 en Ubuntu 24.04 LTS

Instalar MySQL 5.7 en Ubuntu 24.04 1. Descargar e instalar MySQL Copiar mkdir ~/mysql57 cd ~/mysql57 wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-5.7.44-linux-glibc2.12-x86_64 /usr/local/mysql sudo ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql 2. Instalar dependencias necesarias IMPORTANTE: Se descargan las versiones nuevas de las librerías y se las vincula con las librerías que necesita MySQL. Copiar sudo apt update # Reemplazo de libaio sudo apt install libaio1t64 # Reemplazo de libtinfo y ncurses sudo apt install libtinfo6 libncurses6 Copiar # Crear los enlaces simbólicos sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1 sudo ln -sf /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5 sudo ln -sf /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64...

Instalar DeepSeek R1 1.5B en Ubuntu 24.04 sin GPU

Instalar DeepSeek en tu sistema sin GPU, pasos: Especificaciones del Entorno de Pruebas Componente Detalle SO Ubuntu Cinnamon 24.04 LTS x86_64 Kernel 6.8.0-51-generic CPU Intel i7-6820HQ (8 núcleos) @ 3.600GHz GPUs AMD ATI Radeon HD 8830M / R7 250 / R7 M465X Intel HD Graphics 530 RAM 15.882 GB (3.716 GB en uso) Resolución 1440x810 Escritorio Cinnamon 6.0.4 1. Instalar Git LFS sudo apt-get install git-lfs git lfs install 2. Clonar el repositorio cd /opt sudo mkdir deepseek && sudo chown $USER:$USER deepseek cd deepseek git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B 3. Crear y activar un entorno virtual python -m ve...

Instalar Jasper Studio 6.21 para Ubuntu 24.04

Instalar js-studiocomm_6.21.3 en Ubuntu 24.4 Para instalar Jaspersoft Studio en Ubuntu 24.4, sigue estos pasos: 1. Descargar Jasper Studio Descarga la versión js-studiocomm_6.21.3 desde el siguiente enlace: Jaspersoft Studio 6.21.3 2. Crear el directorio de instalación mkdir /opt/jasperstudio 3. Mover el archivo descargado mv /dir_descarga/js-studiocomm_6.21.3_linux_x86_64.tgz /opt/jasperstudio/ cd /opt/jasperstudio 4. Extraer el archivo tar -xvzf js-studiocomm_6.21.3_linux_x86_64.tgz cd js-studiocomm_6.21.3 5. Ejecutar Jaspersoft Studio ./Jaspersoft\ Studio 6. Crear acceso directo en el escritorio Para facilitar el acceso, crea un archivo .desktop en el escritorio: gedit ~/Escritorio/jaspersoft-studio.desktop En el archivo jaspersoft-studio.desktop , agrega lo siguiente: [Desktop Entry] Version=1.0 Ty...