Django: Querysets для выбора из модельного поля - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть простое приложение для встреч, которое позволяет пользователям подписываться на незаполненные временные интервалы. Пользователь выберет дату и запросит в базе данных временные интервалы, доступные на этот день. Как мне сделать запрос, чтобы получить временные интервалы, которые все еще доступны?

models.py

class Appointment(models.Model):
    TIMESLOT_LIST = (
        (1, '10:00 – 11:00'),
        (2, '11:00 – 12:00'),
        (3, '12:00 – 13:00'),
        (4, '13:00 – 14:00'),
        (5, '14:00 – 15:00'),
        (6, '15:00 – 16:00'),
        (7, '16:00 – 17:00'),
        (8, '17:00 – 18:00'),
        (8, '18:00 – 19:00'),
    )

    date = models.DateField(default=date.today)
    timeslot = models.IntegerField(choices=TIMESLOT_LIST, null=True)

views.py

def make_appointment(request):
    all_appointments = Appointment.objects.values_list('timeslot')
    appointments = Appointment.objects.filter(user=request.user)
    data_input = request.GET.get('date')

    available_appointments = Appointment.objects.filter(
        date = data_input
    ).exclude(timeslot = appointments).values_list(
        'timeslot'
    ).order_by('timeslot')

    return TemplateResponse(
        request,
        'scheduling/appointment.html',
        {
            "appointments" : appointments,
            "all_appointments" : all_appointments,
            "data_input": data_input
        }
    )

1 Ответ

2 голосов
/ 06 апреля 2019

Вы можете сформировать новый список доступных времен, выполнив;

available_appointments = [
    (value, time) for value, time in TIMESLOT_LIST if value not in all_appointments
]

Или, если вы хотите кортеж;

tuple(
    (value, time) for value, time in TIMESLOT_LIST if value not in all_appointments
)

Затем вы можете предложить эти варианты в шаблоне для выбора.

Пример с терминала;

>>> [(value, time) for value, time in TIMESLOT_LIST if value not in [1, 2, 3]]
[(4, '13:00 – 14:00'), (5, '14:00 – 15:00'), (6, '15:00 – 16:00'), (7, '16:00 – 17:00'), (8, '17:00 – 18:00'), (8, '18:00 – 19:00')]
...