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