2016-05-25 1 views
0

Я застрял и надеюсь, что вы можете мне помочь.Что такое эффективный способ обнаружения диапазона дат объекта?

У меня есть приложение для аренды велосипедов, где пользователь через календарь выбирает диапазон дат (от startUser до endUser). Каждый велосипед имеет несколько копий (Variation), если некоторые из копий доступны в пользовательском диапазоне, он будет принимать что.

я знаю формулу: если нет (endBike < startCar или startUser> endBike): они наложились

и имеют модели так:

class Bike(models.Model): 
    name = models.CharField(max_length = 200) 

class Variation(models.Model): 
    bike = models.ForeignKey(Bike) 

class RentDate(models.Model): 
    startBike= models.DateField(blank=True, null=True) 
    endBike = models.DateField(blank=True, null=True) 
    variation = models.ForeignKey('Variation',null=True, blank=True) 

Но не знаю, на самом деле, как разобрать все даты и определить, доступны ли даты для одного из вариантов.

Спасибо

+0

Это не очень понятно, что вы просите. Что такое 'startBike',' endBike' и 'startUser'? – solarissmoke

+0

Не могли бы вы объяснить свою модель. Я не ожидал бы арендовать «Вариацию», кроме велосипеда. –

ответ

0

Вам может понадобиться что-то вроде этого:

available_bikes = Variation.objects.filter(... 
    ).exclude(
    Q(rentdate__startCar__range=(start_date, end_date)) | 
    Q(rentdate__endCar__range=(start_date, end_date)) 
    ) 

Это будет проверять, что арендная дата начала и дата окончания не арендовано другим пользователем.

после этого, все, что вам нужно сделать, это убедиться в том, что некоторые велосипеды, делая строения:

if not available_bikes: 
    bikestoshow = None 
else: 
    bikestoshow = available_bikes[0].id #list of bike IDs 
+0

Спасибо, человек! Решение, которое я искал. – chokk

+0

Рад, что я мог помочь. Без этого сообщества я не смог бы закончить многие из моих собственных проектов. – WayBehind

0

Если вы используете Джанго> = 1.8, вы можете использовать DurationField для вашей модели.

С DurationField вам не нужно устанавливать время начала и окончания. И установив DurationField unique = True, вы можете проверить, занят ли этот период времени.

Надеюсь полезно.

+0

Спасибо за ваш ответ, но я не уверен, что это поле поддерживается MySQL. – chokk

+0

api поддерживает все поддерживаемые базы данных django, поэтому это поле поддерживается MySQL. – zhaochy