Джанго - застрял на создании системы ценообразования - PullRequest
2 голосов
/ 18 октября 2019

Я делаю веб-сайт "booking airbnb".

На моей странице сведений о квартире есть календарь выбора даты в JQuery UI, который пользователь использует для ввода дат начала и окончания. о бронировании.

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

В моих моделях я создал:

models.py:



class Apartment(models.Model):
    title = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    zipcode = models.CharField(max_length=20)
    description = models.TextField(blank=True)
    apartment_price = models.IntegerField()
    bedrooms = models.IntegerField()
    bathrooms = models.DecimalField(max_digits=2, decimal_places=1)
    garage = models.IntegerField(default=0)
    size = models.IntegerField()
    photo_main = models.ImageField(upload_to='photos/%Y/%m/%d/')
    list_date = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.title

class ApartmentImages(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete="models.CASCADE", related_name="image")
    image = models.ImageField("image")

    def __str__(self):
        return self.image.url


class ApartmentPrices(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete="models.CASCADE", related_name="price")
    price_start_date = models.DateField(blank=True, null=True)
    price_end_date = models.DateField(blank=True, null=True)
    price = models.IntegerField()

    def __str__(self):
        return self.apartment.title

class Reservation(models.Model):
    apartment = models.ForeignKey(Apartment, related_name='reservations',
                                  on_delete=models.CASCADE, blank=True, null=True)
    start_date = models.DateField(blank=True, null=True)
    end_date = models.DateField(blank=True, null=True)
    name = models.CharField(default="", max_length=200)

    def __str__(self):
        return self.name

Это то, что я имею до сих пор. Я пробовал много разных вещей, но я застрял в логике того, как это должно работать.

вот мое мнение:


def apartment_view(request, apartment_id):

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)
    prices = ApartmentPrices.objects.filter(apartment__pk=apartment_id)
    context = {}
    context['apartment'] = apartment
    context['prices'] = prices

    # svi datumi za cijene
    price_dates = []
    for start, end, price in prices.values_list('price_start_date', 'price_end_date', 'price'):
        while start <= end:
            price_dates.append(start.strftime('%-d-%m-%Y'))
            price_dates.append(price)
            start += datetime.timedelta(days=1)


    unavailable = []
    for start, end in apartment.reservations.values_list('start_date', 'end_date'):
        while start <= end:
            unavailable.append(start.strftime('%-d-%m-%Y'))
            start += datetime.timedelta(days=1)
    form = ReservationForm()
    context['unavailable_dates'] = json.dumps(unavailable)
    context['form'] = form

    if request.method == 'GET':
        form = ReservationForm()

    elif request.method == 'POST':
        form = ReservationForm(request.POST)
        if form.is_valid():
            reservation = form.save(commit=False)
            reservation.apartment = apartment
            reservation.save()
            form.save()
            return render(request, "booking/apartment.html", context)


    return render(request, 'booking/apartment.html', context)

Так что кто-нибудь может помочь мне разобратьсяКаков наилучший способ сравнить выбранные пользователем даты с датами цен в БД и получить цену?

Спасибо большое, сейчас застряли на этом.

1 Ответ

2 голосов
/ 18 октября 2019

Вы можете дать Appartment метод для извлечения цены, в которой заданный объект даты находится между начальной и конечной датой. (не проверено)

...
from django.db.models import Q


class Apartment(models.Model):
    ...
    def price_by_date(self, date_obj):
        """returns the first price with date_obj is between start and end date

        Args:
            date_obj(datetime.date): the date of the price you want

        Returns:
            ApartmentPrices: first valid price found
        """
        # self.price is a back reference to all prices with self as apartment
        # you named it by giving related_name="price" in ApartmentPrices.apartment
        return self.price.filter(
            Q(price_start_date__lte=date_obj) & Q(price_end_date__gte=date_obj)
        ).first()
    ...

В представлении вы должны иметь возможность:

...
def apartment_view(request, apartment_id):

    reservation = Reservation.objects.filter(apartment__pk=apartment_id)
    apartment = get_object_or_404(Apartment, pk=apartment_id)
    date_price = apartment.price_by_date(datetime.date(2019, 10,18))
    # date_price.price would be the integer
    ...

Дополнительная информация:

Q - запросы используется для объединения двух запросов (начало + конец) в один запрос.

...