自动给django中的职位名称

时间:2017-05-01 18:15:45

标签: python django

我正在使用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( )
  

这是位置命名的完成方式

enter image description here

因为你可以看到它在中间是空的,所以不使用第3列。我的问题是如何根据图表自动命名位置(就像我在创建总线对象时创建座位),而不必进入单独的座位对象并命名位置。我希望你能得到我的问题。如果您需要更多信息,请告诉我。

2 个答案:

答案 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))
                )