Django Метод нестандартной модели с дополнительными параметрами - PullRequest
0 голосов
/ 09 мая 2020

Я создаю пункт проката велосипедов.

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

Цена: цена рассчитана на 2 условиях. Категория и продолжительность транспортного средства. (Поскольку цена указана с указанием продолжительности.

1-3 дня = 145 $ спортивный

1-3 дня = 145 $ самокат

4-7 дней = 2004 sporty

4-7 дней = самокат 2004 года c.

Продолжительность может быть достигнута только с выбранных дат из формы во внешнем интерфейсе, которая конвертируется в дни.

Мне нужно передать эти дни как продолжительность , чтобы получить соответствующую цену и отобразить ее в каждой категории соответственно в виде списка.

MODELS.PY

class VehicleCategory:

@property
    def price(self, duration):
        for item in VehiclePrice.objects.all():
            If item.vehicle_category.title == self.title and (duration >= item.slab.start and duration <= item.slab.end):
            return item.net_price

VIEWS.PY

class HomeView (ListView):

template_name = 'app/home.html'

def get(self, request): 


    if request.method == "GET":
        start_date =  request.GET.get('start_date')
        end_date =  request.GET.get('end_date')

        if start_date and end_date:
            start_date = datetime.strptime(start_date, "%m/%d/%Y").date()
            end_date = datetime.strptime(end_date, "%m/%d/%Y").date()

            duration = (end_date - start_date).days +1



        vehiclecategory= VehicleCategory.objects.all()

        context = {
            'vehiclecategory1': vehiclecategory.filter(main_category= 'E-Cycle'),
            'vehiclecategory2': vehiclecategory.filter(main_category= 'E-Scooter'),
            'form':CartQuantityForm(),
            'dateform': DateForm()
        }


    return render(request, self.template_name, context )

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Исходя из предоставленной вами информации, для обеспечения цены необходимо выполнение следующих условий:

  • VehiclePrice.title == VehicleCategory.title
  • VehiclePrice.slab.start <= duration </li>
  • VehiclePrice.slab.end> = duration

Обратите внимание, что с @property вы не можете передавать аргументы своей функции, поскольку вы будете вызывать ее с помощью obj.price вместо obj.price(duration).

Это приведет к следующему QuerySet:

def price(self, duration):
    return VehiclePrice.objects.filter(
        title=self.title,
        slab__start__lte=duration,
        slab__end__gte=duration).first()

Это возвращает первый объект, который удовлетворяет этим условиям. Обратите внимание: если цены не найдены, first() возвращает None в соответствии с docs .

Если вы хотите вызвать этот метод в своем шаблоне, вы должны создать custom тег шаблона и передайте длительность этому тегу, чтобы вернуть цену.

Другой вариант - получить все категории в вашем представлении и получить вместе с ними соответствующие цены.

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

0 голосов
/ 09 мая 2020

Views.py

template_name = 'app/home.html'

def get(self, request): 


    if request.method == "GET":
        start_date =  request.GET.get('start_date')
        end_date =  request.GET.get('end_date')

        vehiclecategory= VehicleCategory.objects.all()

        if start_date and end_date:
            start_date = datetime.strptime(start_date, "%m/%d/%Y").date()
            end_date = datetime.strptime(end_date, "%m/%d/%Y").date()

            duration = (end_date - start_date).days +1
            vehiclecategory = vehiclecategory.filter(slab__start__lte=duration, slab__end__gte=duration)


        context = {
            'vehiclecategory1': vehiclecategory.filter(main_category= 'E-Cycle'),
            'vehiclecategory2': vehiclecategory.filter(main_category= 'E-Scooter'),
            'form':CartQuantityForm(),
            'dateform': DateForm()
        }


    return render(request, self.template_name, context )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...