#python #django #django-models #django-views
Вопрос:
Я работаю над приложением, в котором я храню информацию о расходе топлива транспортных средств, цель состоит в том, чтобы каждый раз, когда транспортное средство заправляется, рассчитывать расход топлива на километр и хранить его.
мои модели:
class Refuel(models.Model):
user = models.ForeignKey(User, on_delete=models.PROTECT, related_name=_("responsable_user"), default=1)
vehicle = models.ForeignKey("vehicle.Vehicle", blank=True, null=True, on_delete=models.PROTECT)
gaz_station = models.ForeignKey(
GazStation, related_name=_("Refuel_Station"), blank=True, null=True, on_delete=models.PROTECT
)
odometer_reading = models.PositiveIntegerField(_("Compteur KM"), blank=True, null=True)
snitch = models.PositiveIntegerField(_("Mouchard KM"), blank=True, null=True)
fuel_quantity = models.DecimalField(_("Quantitée en Litres"), max_digits=5, decimal_places=1)
fuel_unit_price = models.DecimalField(_("Prix en DH"), max_digits=6, decimal_places=2)
note = models.CharField(_("Remarque"), max_length=255, blank=True, null=True)
created_at = models.DateTimeField(_("Created at"), auto_now_add=True, editable=False)
updated_at = models.DateTimeField(_("Updated at"), auto_now=True)
is_active = models.BooleanField(default=True)
@property
def total_price(self):
total_price = self.fuel_quantity * self.fuel_unit_price
return total_price
class Meta:
ordering = ["gaz_station", "-created_at"]
def __str__(self):
return self.vehicle.serie
class FuelConsumption(models.Model):
vehicle = models.ForeignKey("vehicle.Vehicle", blank=True, null=True, on_delete=models.PROTECT)
gaz_station = models.ForeignKey(
GazStation, related_name=_("Station_consuption"), blank=True, null=True, on_delete=models.PROTECT
)
Controlor_id = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.PROTECT,
limit_choices_to={"is_controlor": True, "is_active": True},
)
driver = models.ForeignKey(
User, related_name=_("Vehicle_Driver_consuption"), blank=True, null=True, on_delete=models.PROTECT
)
consumption = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True)
created_at = models.DateTimeField(_("Created at"), auto_now_add=True, editable=False)
updated_at = models.DateTimeField(_("Updated at"), auto_now=True)
is_active = models.BooleanField(default=True)
class Meta:
ordering = ["vehicle", "-created_at"]
def __str__(self):
return self.vehicle.serie
У меня есть представление для модели заправки, где я хочу, если возможно, рассчитать расход топлива на километр, позвонив в последний объект для транспортного средства, получить одометр, рассчитать расстояние и разделить предыдущее количество заправки на это расстояние и сохранить его.
Мое мнение таково:
class RefuelCreationView(LoginRequiredMixin, CreateView):
model = Refuel
form_class = RefuelCreationForm
template_name = "refuel/refuel_form.html"
success_url = reverse_lazy("refuel:controlor-refuel-list")
def form_valid(self, form):
form.instance.user_id = self.request.user.id
form.instance.gaz_station = GazStation.objects.get(Controlor_id=self.request.user.id)
return super().form_valid(form)
def test_func(self):
return self.request.user.is_active and self.request.user.is_controlor
Это мой первый проект после изучения Django, работая над учебником, и я надеюсь получить помощь в этом.
Комментарии:
1. Похоже, ты на правильном пути. Каков ваш реальный вопрос?
2. Я решил проблему, я получаю последнюю запись для каждого транспортного средства в «form_valid» до этого и сделал расчет, который я хотел, прежде чем сохранять новые данные о заправке. Я добавляю решение ниже, если у вас есть какие-либо рекомендации, я буду рад
Ответ №1:
Я понял, как это сделать, вид, который я использовал, таков :
class RefuelCreationView(LoginRequiredMixin, CreateView):
model = Refuel
form_class = RefuelCreationForm
template_name = "refuel/refuel_form.html"
success_url = reverse_lazy("refuel:controlor-refuel-list")
def form_valid(self, form):
form.instance.user_id = self.request.user.id
form.instance.gaz_station = GazStation.objects.get(Controlor_id=self.request.user.id)
old_refuel_data = Refuel.objects.order_by().distinct("vehicle")
for refuel in old_refuel_data:
if refuel.vehicle == form.instance.vehicle and form.instance.odometer_reading:
consumption = (refuel.fuel_quantity / (form.instance.odometer_reading - refuel.odometer_reading)) * 100
FuelConsumption.objects.create(
vehicle=refuel.vehicle,
gaz_station=form.instance.gaz_station,
Controlor_id=self.request.user,
driver=refuel.vehicle.driver,
consumption=consumption,
is_active=True,
)
elif refuel.vehicle == form.instance.vehicle and form.instance.snitch:
consumption = (refuel.fuel_quantity / (form.instance.snitch - refuel.snitch)) * 100
FuelConsumption.objects.create(
vehicle=refuel.vehicle,
gaz_station=form.instance.gaz_station,
Controlor_id=self.request.user,
driver=refuel.vehicle.driver,
consumption=consumption,
is_active=True,
)
return super().form_valid(form)
def get_queryset(self, *args, **kwargs):
return Refuel.objects.select_related("vehicle__gaz_station__Controlor_id").filter(
vehicle__gaz_station__Controlor_id=self.request.user
)
Но я не знаю, почему метод queryset не дает мне только набор транспортных средств, который я хочу отобразить в списке выбора.
Я опубликую решение, если оно у меня будет.