Estoy construyendo un sitio web de reserva de autobuses usando Django. Tengo una posición de atributo en mi mesa 'asiento'. Está vinculado al bus (tabla) por ForeignKey. Cada vez que se crea un autobús, se crean instancias de asientos iguales a la capacidad del autobús (la capacidad la define el usuario en la tabla de autobuses). Quiero nombrar las posiciones como 1_1, 1_2, 1_4, 1_5, 2_1, 2_2, 2_4, 2_5, etc. donde el primer dígito antes del guión bajo representa una fila y el dígito después del guión bajo representa una columna. No estoy usando 3 porque es el pasillo.
estos son mis modelos.py
class Seat(models.Model): class Meta: verbose_name_plural = "Seat" id = models.AutoField(primary_key=True,) position = models.CharField(max_length=4) bus = models.ForeignKey(Bus) status = models.CharField(max_length=20, choices=(('available', 'available'), ('reserved', 'reserved'), ('unavailable', 'unavailable'),), default='Available') def __str__(self): return '{0}-{1}-{2}'.format((self.bus),(self.id),(self.status)) @receiver(post_save, sender=Bus) def create_seats(sender, instance, created, **kwargs): if created: for seat in range (0, int(instance.capacity)): instance.seat_set.create( )Así se hace el nombramiento de puesto
como puede ver, está vacío en el medio, por lo que no se usa esa tercera columna. Mi pregunta es cómo puedo nombrar automáticamente las posiciones (como creo asientos cada vez que se crea un objeto de autobús) de acuerdo con el gráfico sin tener que ir al objeto de asiento individual y nombrar la posición. Espero que recibas mi pregunta. Si necesita más información, por favor hágamelo saber.
Suponiendo que el diseño del bus es siempre el mismo:
@receiver(post_save, sender=Bus) def create_seats(sender, instance, created, **kwargs): if created: for place_num in range(1, int(instance.capacity)+1): row = (place_num // 5) + 1 col = (place_num % 5) + 1 if col != 3 and row*col not in [24, 25]: instance.seat_set.create(position='%i_%i' % (row, col))Esta respuesta asume que los autobuses pueden tener diferentes diseños de asientos, lo que significa que deberá definir el patrón de asientos para cada tipo de autobús.
La forma más básica sería definirlos como constantes, como listas/matrices bidimensionales, ingresando 1 para un asiento y 0 para ningún asiento:
#seating_patterns.py BUS_1 = [ [1, 1, 0, 1, 1], [1, 1, 0, 1, 1], [1, 1, 0, 1, 1], [1, 1, 0, 1, 1], [1, 1, 0, 0, 0], [1, 1, 0, 1, 1], [1, 1, 0, 1, 1], [1, 1, 0, 1, 1], [1, 1, 1, 1, 1], ] BUS_2 = [etc] SEATING_ARRAYS = {'BUS_1': BUS_1, 'BUS_2': BUS_2}Para hacer que esto sea más fácil de mantener, puede crear un modelo SeatingPattern, por ejemplo, con un ArrayField si esa es una opción para usted.
De lo contrario, importe los arreglos de asientos en su archivo de modelos:
# models.py from .seating_patterns import SEATING_ARRAYSy agregue un campo de patrón de asiento a su modelo de autobús, con una tupla de opciones para los autobuses:
class Bus(models.Model): … SEATING_PATTERNS = ( ('BUS_1', 'BUS_1'), ('BUS_2', 'BUS_2'), ) … seating_pattern = models.CharField(choices=SEATING_PATTERNS, max_length=50)Y cree la salida de formato correcta (1_1, 1_2, etc.) como esta en su señal post_save:
if created: seating_pattern = SEATING_ARRAYS[instance.seating_pattern] for row,seats in enumerate(seating_pattern): for pos,seat in enumerate(seats): if seat: Seat.objects.create( bus=instance, position="{}_{}".format(str(row+1), str(pos+1)) )