【问题标题】:Django - Stuck On Creating a Pricing SystemDjango - 坚持创建定价系统
【发布时间】:2023-03-07 05:15:01
【问题描述】:

我正在制作一个“预订 airbnb”网站。

在我的公寓详细信息页面上,我有一个 JQuery UI Date Picker 日历,用户使用它来输入预订的开始日期和结束日期。

一旦完成并且用户提交了我想刷新整个网站的表单,刷新时会显示用户之前选择的日期,以及每天的价格和总价。

在我创建的模型中:

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)

那么谁能帮我弄清楚将用户选择的日期与数据库中的价格日期进行比较并获得价格的最佳方法是什么?

非常感谢,已经卡了一段时间了。

【问题讨论】:

  • 你真的要刷新还是之前不了解 AJAX?
  • 嗨蒂亚戈,感谢您的回答。我真的需要刷新,我不应该使用 JS/AJAX。这一切都必须在后端完成。

标签: python django model business-logic


【解决方案1】:

您可以为 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 - queries 用于将两个查询(开始+结束)合并为一个查询。

【讨论】:

  • 谢谢弗兰克!你能用几句话解释一下这是如何工作的吗?我还是个初学者,这是我在模型上的第一个方法 lol
  • 当我尝试做 Apartment.price_by_date(request.POST, end_date) 时,我还得到:'QueryDict' 对象没有属性'price'
  • 是的,我明白了,哈哈。谢谢 !但是使用“Apartment.price_by_date(Apartment,end_date)”我得到:'ReverseManyToOneDescriptor'对象没有属性'get'
  • 当我这样做时,我从查询中得到的只是公寓名称,在本例中为“28 West St”
  • 不,应该没问题。唯一的问题是,您由 price_by_date 返回的 ApartmentPrices 对象现在称为“28 West St”,但它是一个对象,请使用它;-) 还是您只想将价格作为整数?那么您只需要从您的对象中访问属性“价格”。 date_price.price 在我的示例中。
猜你喜欢
  • 2020-06-07
  • 2022-11-21
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多