Django 动态选择字段,约会槽

标签 django python-3.x filter django-rest-framework aggregate

我需要一些关于如何为表单创建动态选择字段的指导。上下文是约会的上下文。我想让人们能够自行预约,但需要基于某些标准。标准是日期、时间和人数。

我希望时间字段是一个动态选择字段。基于日期和派对规模“psize” 我本来以为可以通过filter、aggregate、sum来实现。使用从中归档的任何人的输入。

我在想我可以从表格中获取日期和聚会规模,并使用它来过滤和总结选择相同选择的人数(这很重要,因为我希望 15 人或更少的人注册任何给定时间段)我的时间段以 15 分钟为增量,并列在一个元组中(如常规选择字段)。有什么想法吗?

模型.py

class Reservation(models.Model):
"""This tuple is for the Inside, Outside, First Available 
drop down menu for the reservations tab """
    INSIDEOUTSIDE = (
        ('Inside','Inside'),
        ('Outside', 'Outside'),
        ('First Available', 'First Available'),
    )

    STATUS = (
        ('Reservation','Reservation'),
        ('Checked In','Checked In'),
        ('Seated','Seated'),
    )

    PARTYSIZE = (
        (1,'1'),
        (2,'2'),
        (3,'3'),
        (4,'4'),
        (5,'5'),
        (6,'6'),
        (7,'7'),
        (8,'8'),
        (9,'9'),
        (10,'10'),
        (11,'11'),
        (12,'12'),
    )    

    TIMEPERIOD= (
        ('11:30','11:30'),
        ('11:45','11:45'), 
        ('12:00','12:00'), 
        ('12:15','12:15'), 
    )


    name = models.CharField(max_length=22)
    psize = models.IntegerField('Party Size', choices= PARTYSIZE)
    Date = models.DateField()
    Time = models.CharField(max_length=15, choices=TIMEPERIOD)
    location = models.CharField(max_length=15, choices= INSIDEOUTSIDE, default= 'First Available')
    status = models.CharField(max_length=15, choices=STATUS, default='Reservation')

下面是有效的过滤器,但不完全是。它返回我在其中键入的项目,我希望能够将它传递给它一个列表并让它用零件尺寸“psize”进行计算并将列表传回具有可用时隙的表单(时隙少于 15 人,包括填入表格的人数)。

Reservation.objects.filter(Date='2018-01-01',Time='2:30').aggregate(Sum('psize'))

谁能指出我正确的方向?有什么想法吗?

更新 下面是我在 shell 中用来确定选择的代码。

def getchoices(request):
    DATE = request.POST.get('Date')
    psize_input = request.post.get('psize')
    slots = Reservation.objects.filter(Date=DATE).values_list('Time').annotate(Sum('psize'))
    TIMEPERIOD= (
    ('11:30','11:30'),
    ('11:45','11:45'),
    ('12:00','12:00'),
    ('12:15','12:15'),
    ('12:30','12:30'),
    ('12:45','12:45'),
    ('01:00','01:00'),
    ('01:15','01:15'),
    ('01:30','01:30'),
    ('01:45','01:45'),
    ('02:00','02:00'),
    ('02:15','02:15'),
    ('02:30','02:30'),
    )
    def checkpsize():
            fullslots1=[]
            fullslots2=[]
            for object in slots:
                    if object[1] > 15-psize_input:
                            fullslots1.append(object[0])
                            fullslots2.append(object[0])
                            fullslotszip = zip(fullslots1, fullslots2)
                            fullslotstup = list(fullslotszip)
                            newchoices = list(filter(lambda x: x not in fullslotstup, TIMEPERIOD))
            return newchoices

但是,我发现很难将它与我的表单联系起来。我似乎无法弄清楚如何在我的表单中实现 ajax 以根据 psize 和日期输入填充我的时间字段。关于开始的好地方有什么想法吗?教程可能?

最佳答案

假设您的用户插入了一个值 psize_input,您可以使用:

 Reservation.objects
    .order_by('Date', 'Time')
    .values('Date', 'Time')
    .annotate(Sum('psize'))  # adds psize sum for each distinct data/time combo
    .filter(psize__sum__lte=15-psize_input)  # filters combos with enough capacity

获取以下形式的字典列表(实际上是 ValuesIterable):

[
    {'Date': datetime.date(2018, 10, 31), 'Time': '11:30', 'psize__sum': 5},
    {'Date': datetime.date(2018, 10, 31), 'Time': '12:15', 'psize__sum': 2},
    {'Date': datetime.date(2018, 11, 1), 'Time': '11:45', 'psize__sum': 7},
    # ...
]

恰好包含有足够剩余容量的时隙以及该时隙的当前 psize 总数。

关于Django 动态选择字段,约会槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53073965/

相关文章:

python - Django 通过 Docker 错误 : That IP address can't be assigned to

python - 在 Python 中使用函数返回子字符串

python-3.x - 在 python 脚本中订阅两个主题 MQTT

c - 哪些 DSP 滤波器算法易于实现?

angularjs - Angular : change data on ng-repeat with filter function

java - 没有成功链接这两个 ffmpeg 命令

python - 使用 pytest-django 在参数化测试之间保存数据

c++ - 我如何将 C++ 和 Python 与 SWIG 集成

python - Djongo 查询 BooleanField 失败

python-3.x - Pytest 创建临时 CSV 文件以供读取