es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

gestor relacionado de modelos de Django

Quiero desarrollar una aplicación DJANGO para reservar habitaciones.
Quiero usar los siguientes DOS modelos.

class Room(models.Model):  
    room_no = models.IntegerField()
    remarks = models.CharField(max_length=100)

    def __str__(self):
        return self.remarks

class Roombooking(models.Model):    
    room = models.ForeignKey(Room, related_name='roombookingforroom', on_delete=models.CASCADE)
    booked_for_date = models.DateField(blank=True, null=True)
    booked_by = models.TextField(max_length=1000, default='')
    remarks = models.CharField(max_length=100,)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['room', 'booked_for_date'],
                name='unique_room_date',
            ),
        ]

    def __str__(self):
        return self.room.remarks

Para evitar asignar una habitación a dos personas diferentes en cualquier día, se utiliza “UniqueConstraint”.

Ahora, ¿cómo se consulta la lista de habitaciones disponibles desde FECHA1 hasta FECHA2?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para consultar una lista de habitaciones disponibles entre DATE1 y DATE2, puedes usar el siguiente código:

    # tu_vista.py
    
    from django.shortcuts import render
    from django.db.models import Q
    
    from .models import Room, Roombooking
    
    
    def lista_habitaciones_disponibles(request, date1, date2):
        # primero, obtenemos todas las reservas de habitaciones dentro del rango date1 a date2
        habitaciones_reservadas = Roombooking.objects.filter(
            Q(booked_for_date__gte=date1, booked_for_date__lte=date2) |
            Q(booked_for_date__lte=date1, end_date__gte=date1)
        ).values_list('room_id', flat=True)
    
        # luego, obtenemos todas las habitaciones que no están en la lista de habitaciones_reservadas
        habitaciones_disponibles = Room.objects.exclude(id__in=habitaciones_reservadas)
    
        return render(request, 'habitaciones_disponibles.html', {'habitaciones': habitaciones_disponibles})
    

    Explicación:

    • Primero, usamos el objeto Q para filtrar objetos Roombooking en los que la fecha de reserva (booked_for_date) caiga dentro del rango date1 y date2, o donde la reserva abarque el rango dado.
    • Usamos el método values_list para crear una lista plana con los ID de las habitaciones reservadas.
    • Luego, usamos el método exclude para obtener todos los objetos Room que no estén en la lista de habitaciones_reservadas.

    Puedes personalizar la vista y la plantilla según sea necesario para mostrar la lista de habitaciones disponibles de forma amigable para el usuario.

Comments are closed.