Django: обновлять модель атрибута через определенный промежуток времени - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть форма бронирования автомобиля.Форма перенаправляется в представление после сохранения.Представление выбирает идентификатор формы , т. Е. Экземпляр моей модели Reservation, а затем выбирает конкретное транспортное средство из поля chosen_car формы, а затем следует обновитьатрибут available этого транспортного средства False.

Теперь пользователь заказывает автомобиль на фиксированный период времени .Когда время истечет, я хочу, чтобы атрибут available конкретного экземпляра транспортного средства в модели Vehicle был установлен на True.

Я попытался реализовать это, используя цикл while в виде, ноэто просто не работает.Я хочу, чтобы этот процесс был несколько автоматизирован , т. Е. Для экземпляра транспортного средства атрибут available обновляется до False, когда это транспортное средство зарезервировано, и обновляется до True, когда время истекает.Таким образом, он становится доступным для других пользователей.

# My Vehicle model:

class Vehicle(models.Model):
    car_no = models.CharField (max_length = 20, blank=False)
    car_model = models.ForeignKey (Car_model, on_delete=models.CASCADE)
    garage = models.ForeignKey (Garage, on_delete=models.CASCADE)
    category = models.ForeignKey (Category, on_delete=models.CASCADE)
    available = models.BooleanField(default=True)

# The Reservation model:

class Reservation(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    date_from = models.DateField(auto_now=False, auto_now_add=False, blank=False)
    date_to = models.DateField(auto_now=False, auto_now_add=False, blank=False)
    time_from = models.TimeField(auto_now=False, auto_now_add=False, blank=False)
    time_to = models.TimeField(auto_now=False, auto_now_add=False, blank=False)
    garage = models.ForeignKey(Garage,on_delete=models.CASCADE, blank=False, verbose_name="Start from")
    destination=models.CharField(max_length=20, blank=False, verbose_name="Where will you go")
    chosen_vehicle=models.CharField(max_length = 20, blank=False, default='')
    booking_time=models.DateTimeField(default = datetime.now)

Представление, которое я использовал, чтобы установить для атрибута Vehile модель available каждого забронированного автомобиля значение True или False:

def carDBconfigView(request, pk):
    this_form = Reservation.objects.get(pk = pk)
    the_car = this_form.chosen_vehicle
    v = Vehicle.objects.get(car_no = the_car)
    v.available = False
    v.save()
    to = this_form.date_to
    to_time = this_form.time_to

    #while datetime.date.today() > to and datetime.datetime.now().time() > to_time:  # tried this first
    while datetime.datetime.now().time() > to_time:
    while datetime.date.today() > to:
        c = Vehicle.objects.get(car_no = the_car)
        c.available = True
        c.save()
    return redirect('review')

Форма бронирования, которую я определил:

class NewReservationForm(forms.ModelForm):
    class Meta:
        model= Reservation
        exclude = ['user','chosen_vehicle','garage','booking_time']

Как я могу установить для атрибута available значение True или False на основе установленных дат, не всегда вручную настраивая каждый автомобильдо True или False?

1 Ответ

0 голосов
/ 24 февраля 2019

Измените from и to на DateTmeField и пусть chosen_vehicle будет ForeignKey для Vehicle:

class Reservation(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    from = models.DateTimeField(auto_now=False, auto_now_add=False, blank=False)
    to = models.DateTimeField(auto_now=False, auto_now_add=False, blank=False)
    garage = models.ForeignKey(Garage,on_delete=models.CASCADE, blank=False, verbose_name="Start from")
    destination=models.CharField(max_length=20, blank=False, verbose_name="Where will you go")
    chosen_vehicle=models.ForeignKey(Vehicle, on_delete=models.CASCADE, related_name='reservations')
    booking_time=models.DateTimeField(default = datetime.now)


class Vehicle(models.Model):
    car_no = models.CharField (max_length = 20, blank=False)
    car_model = models.ForeignKey (Car_model, on_delete=models.CASCADE)
    garage = models.ForeignKey (Garage, on_delete=models.CASCADE)
    category = models.ForeignKey (Category, on_delete=models.CASCADE)

    @property
    def available(self):
        now = datetime.now()
        # here we check if we have reservation that started before now and
        # will be finished after now
        reservations = self.reservations.filter(from__gte=now, to__lte=now)
        # exists() return boolean True or False
        return reservations.exists()

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

my_vehicle = Vehicle.objects.get(...)
my_vehicle.available  # will return True or False        

Так что каждый раз, когда вы проверяете my_vehicle.available, он будет рассчитываться в соответствии с текущим временем и возвращать самую свежую информацию.

...