Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中自动给出职位名称_Python_Django - Fatal编程技术网

Python 在django中自动给出职位名称

Python 在django中自动给出职位名称,python,django,Python,Django,我正在用Django建立一个公交车预订网站。我的表“seat”中有一个属性位置。它通过ForeignKey链接到总线(表)。无论何时创建总线,都会创建与总线容量相等的座椅实例(容量由用户在总线表中定义)。我想给这些职位命名,比如1,1,2,1,4,1,5,2,1,2,4,5等等。。其中,下划线前的第一个数字表示行,下划线后的数字表示列。我不使用3,因为它是过道 这是我的模特 这就是位置命名的方式 正如你可以看到的,中间是空的,所以不使用第三列。我的问题是如何根据图表自动命名位置(就像我在创建总

我正在用Django建立一个公交车预订网站。我的表“seat”中有一个属性位置。它通过ForeignKey链接到总线(表)。无论何时创建总线,都会创建与总线容量相等的座椅实例(容量由用户在总线表中定义)。我想给这些职位命名,比如1,1,2,1,4,1,5,2,1,2,4,5等等。。其中,下划线前的第一个数字表示行,下划线后的数字表示列。我不使用3,因为它是过道

这是我的模特

这就是位置命名的方式


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

假设总线布局始终相同:

@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表示座位,输入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}
为了使其更易于维护,您可以创建一个座位模式模型,例如,如果您可以选择使用ArrayField

否则,请将座椅阵列导入模型文件:

# models.py
from .seating_patterns import SEATING_ARRAYS
并向总线模型添加一个座位模式字段,其中包含总线的选项元组:

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_保存信号中创建正确的格式输出(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))
                )

它会产生“选择有效选项”错误。[[1,1,0,1,1]、[1,1,0,1,1,1]、[1,1,0,1,1]、[1,1,0,0,0,0]、[1,1,0,1,1]、[1,1,0,1,1,1]、[1,1,0,1,1,1]、[1,1,1,1,1,1,1]]不是可用的选项之一。好的,我已经对代码进行了一些编辑-现在应该可以了。请参阅对座位模式的更改、新的座位阵列以及对post_保存信号的更改。我无法让bulk_create工作,因此现在它在循环中创建对象-如果这是一个性能问题,您可能希望尝试更改它。此外,保存座位阵列的更好方法是在一个阵列字段中,我相信只有在使用Postgres数据库时,该字段才可用。如果布局发生变化?如果布局发生变化,您可以使用@birophiloit建议的方法“产生此错误”,选择一个有效的选择。[1,1,0,1,1]、[1,1,0,1,1,1]、[1,1,0,1,1]、[1,1,0,0,0,0]、[1,1,0,1,1,1]、[1,1,0,1,1,1]、[1,1,1,0,1,1,1]、不是可用的选择之一。”
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))
                )