Skip to main content
 首页 » 编程设计

python之Django之坚持创建定价系统

2024年09月03日33jackei

I am making a "booking airbnb" website.

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

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

在我创建的模型中:

模型.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) 

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

非常感谢,现在已经坚持了一段时间。

请您参考如下方法:

您可以为 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() 
    ... 

在 View 中你应该能够做到:

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