Использование предыдущих данных модели в классе представления создания для хранения в другой модели

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

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

У меня есть представление для модели Refuel, где я хочу, если возможно, сделать расчет потребления топлива на км, вызвав последний объект для транспортного средства и получить одометр и вычислить расстояние и разделить предыдущее количество заправки на это расстояние и сохранить его.
Вид у меня такой:

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 по учебнику, и я надеюсь на помощь в его выполнении.

Я понял, как это сделать, представление, которое я использовал, следующее :

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 не дает мне только тот набор автомобилей, который я хочу отобразить в списке select.
Я опубликую решение, если найду его.

Вернуться на верх