Джанго: как изменить значение поля или обновить поле в модели / Db.? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть две модели, Автомобиль и Бронирование. Автомобиль - это поле ForeignKey в модели бронирования. Если автомобиль забронирован, он удаляется из списка автомобилей. После того, как автомобиль забронирован, код меняется на is_available_car = false. И тогда автомобиль не отображается в списке автомобилей. но Проблема, с которой я сталкиваюсь:

  1. После того как я удалил бронирование у администратора, автомобиль не отображается в виде списка. если бронирование автомобиля закрыто, я хочу сделать is_available_car = True. Кажется, я не могу изменить его с ложного на истинное.
  2. Я добавил фильтр запроса, чтобы сделать is_available_car = True. Проблема в том, что после того, как автомобиль возвращен и время бронирования закончено, мне приходится каждый раз вручную менять значение is_available_car = True.

Помогите мне, пожалуйста, если после завершения бронирования или я удалю бронирование, доступное значение автомобиля изменится на true !!

Это мои модели и виды:

Модель

class Booking(models.Model):

booking_name = models.CharField(max_length=240, null=False)
customer_name = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='book_customers' )
book_car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name='book_car')
rental_price = models.IntegerField(blank=False, null=False)
times_pick = models.TimeField(blank=True)
is_approved = models.BooleanField(default=False)

def __str__(self):
    return self.booking_name

def get_absolute_url(self):
    return reverse("buggy_app:detail",kwargs={'pk':self.pk})


 class Car(models.Model):

reg_no = models.CharField(max_length=16, unique=True)
model_year = models.DateField()
car_name =models.CharField(max_length=40)
car_image = models.ImageField(upload_to='cars', blank = True)
is_available_car = models.BooleanField(default = False)

     def __str__(self):
       return self.car_name

   def get_absolute_url(self):
      return reverse("buggy_app:details",kwargs={'pk':self.pk})

Просмотры

class BookingView(FormView):
template_name = 'buggy_app/booking.html'
form_class = BookingForm
models = Booking
def form_valid(self, form):
    car_id = self.request.GET.get('car', '')
    car = Car.objects.get(id=car_id)
    car.is_available_car = False
    car.save()
    form.save()
    return super(BookingView, self).form_valid(form)


success_url = reverse_lazy('index')

def get_context_data(self, **kwargs):
    # kwargs['car'] is the car booking now!
    try:
        kwargs['car'] = Car.objects.get(id=self.request.GET.get('car', ''))
    except (Car.DoesNotExist, ValueError):
        kwargs['car'] = None
    return super(BookingView, self).get_context_data(**kwargs)


 class CarListView(ListView):
       context_object_name = 'cars'
       model = models.Car

       def get_queryset(self):
           qs = super(CarListView, self).get_queryset()
           qs = qs.filter(is_available_car=True)
           return qs

1 Ответ

0 голосов
/ 23 июня 2018

Вы можете создать обработчик сигнала, который прослушивает сигнал pre_delete для модели Booking: см. Документацию .Таким образом, каждый раз, когда бронь удаляется, вам будет вызван ваш обработчик сигнала, и вы сможете обновить соответствующий автомобиль.

например

@receiver(pre_delete, sender=Booking):
def update_car(sender, **kwargs):
    car = sender.book_car
    car.is_available = True
    car.save()

Затем убедитесь, что вы зарегистрировали свой обработчик, как описанов документации Django выше.

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

def finish(self):
    self.expired = True  # You'd have to define what it means for a booking to be finished
    car = self.book_car
    car.is_available = True
    car.save()
...