Джанго: как вы фильтруете по датам и внешнему ключу - PullRequest
0 голосов
/ 27 июня 2018

Внутри моделей у меня есть:

  1. Название отеля
  2. Цена за каждую ночь.

models.py:

class Hotel_Database(models.Model):
    hotel_name = models.CharField(max_length=20)

class Hotel_Date_Price(models.Model):
    hotel = models.ForeignKey(Hotel_Database, on_delete=models.CASCADE , related_name='hotel')
    checkin = models.DateField(default= datetime.date.today())  
    checkout = models.DateField(default=datetime.date.today() + datetime.timedelta(1))   
    price = models.IntegerField()

views.py:

import datetime
x = Hotel_Database.objects.get(id=1)
#the price for the night of June 26th:
Hotel_Date_Price.objects.create(hotel = x, checkin= datetime.date(2018, 6, 27), checkout=datetime.date(2018, 6,28), price=50).save()
#the price for the night of June 27th:
Hotel_Date_Price.objects.create(hotel = x, checkin= datetime.date(2018, 6, 28), checkout=datetime.date(2018, 6,29), price=50).save()


Hotel_Database.objects.filter(hotel_name__icontains='Hotel', hotel__checkin__lte=datetime.date(2018, 6, 27), hotel__checkout__gte=datetime.date(2018, 6, 28))
#results: <QuerySet [<Hotel_Database: Shangri-La>]>

Теперь вот что происходит, когда я пытаюсь отфильтровать более чем одну ночь:

Hotel_Database.objects.filter(hotel_name__icontains='Hotel', hotel__checkin__lte=datetime.date(2018, 6, 27), hotel__checkout__gte=datetime.date(2018, 6, 29))
#results: <QuerySet []> 
# it returns an empty list 

Я в основном пытаюсь изменить цену каждой ночи

1 Ответ

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

Похоже, вы запутались lte и gte. lte означает меньше чем, а gte больше чем. Таким образом, вы должны использовать дату окончания с условием lte и дату начала с gte:

Hotel_Database.objects.filter(hotel_name__icontains='Hotel', hotel__checkin__gte=datetime.date(2018, 6, 27), hotel__checkout__lte=datetime.date(2018, 6, 29))

Также обратите внимание, что вам не нужно вызывать save() после create() метода. Вы можете просто использовать create().

UPD

Если вам нужно исключить отели с определенным периодом регистрации / выезда из набора запросов, вы можете использовать exclude():

Hotel_Database.objects.filter(hotel_name__icontains='Hotel').exclude( hotel__checkin__gte=datetime.date(2018, 6, 27), hotel__checkout__lte=datetime.date(2018, 6, 29))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...