我正在使用Django建立一个巴士预订网站。我在桌子上有一个属性位置' seat'。它通过ForeignKey链接到总线(表)。无论何时创建总线,创建的座位实例都等于总线的容量(容量由总线表中的用户定义)。我想命名诸如1_1,1_2,1_4,1_5,2_1,2_2,2_4,2_5等位置。其中下划线前的第一个数字表示下划线表示列后的行和数字。我没有使用3,因为它是过道。
这是我的models.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( )
这是位置命名的完成方式
因为你可以看到它在中间是空的,所以不使用第3列。我的问题是如何根据图表自动命名位置(就像我在创建总线对象时创建座位),而不必进入单独的座位对象并命名位置。我希望你能得到我的问题。如果您需要更多信息,请告诉我。
答案 0 :(得分:1)
假设总线布局始终相同:
@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))
答案 1 :(得分:1)
这个答案假设公交车可以有不同的座位布局,这意味着您需要为每种公交车类型定义座位模式。
最基本的方法是将它们定义为常量,作为二维列表/数组,为座位输入1,为无座位输入0:
#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}
为了使这个更易于维护,您可以创建一个SeatingPattern模型,例如使用ArrayField(如果这是一个选项)。
否则将座位阵列导入模型文件:
# models.py
from .seating_patterns import SEATING_ARRAYS
并将seat_pattern字段添加到您的总线模型中,并为总线选择元组:
class Bus(models.Model):
…
SEATING_PATTERNS = (
('BUS_1', 'BUS_1'),
('BUS_2', 'BUS_2'),
)
…
seating_pattern = models.CharField(choices=SEATING_PATTERNS, max_length=50)
在post_save信号中创建正确的格式输出(1_1,1_2等):
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))
)