首页 > 解决方案 > 在更新模型字段之前,如何确保输入的整数大于当前值?

问题描述

我正在使用一种保存到一个模型的表格来更新存储在另一个模型中的最新里程。我想确保输入的里程是 > 或 = 当前里程。我无法弄清楚正确的验证或在哪里编写验证。

我在 CreateView 的 form_valid() 和模型中的 save() 方法中尝试了 if 语句。

模型.py

class Vehicle(models.Model):
     name = models.CharField(blank=True, max_length=100)
     make = models.CharField(blank=True, max_length=100)
     model = models.CharField(blank=True, max_length=100)
     year = models.IntegerField(blank=True, null=True)
     vin = models.CharField(blank=True, max_length=17)
     gvw = models.IntegerField(blank=True, null=True)
     license_plate = models.CharField(blank=True, max_length=100)
     purchase_date = models.DateField()
     current_mileage = models.IntegerField(blank=True, null=True)

   class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('vehicles:vehicle_detail', kwargs={'pk':self.pk})

    @property
    def get_current_mileage(self):
         return self.current_mileage


class FuelEntry(models.Model):
     vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE)
     date = models.DateTimeField(auto_now_add=True)
     fuel_choices = (
         ('EMPTY', 'Empty'),
         ('1/8', '1/8'),
         ('1/4', '1/4'),
         ('1/2', '1/2'),
         ('3/4', '3/4'),
         ('FULL', 'Full'),
    )
     current = models.CharField(max_length=5, choices=fuel_choices)
     after = models.CharField(max_length=5, choices=fuel_choices, blank=True)
     gallons = models.DecimalField(decimal_places=2, max_digits=5, blank=True, default='0')
     cost = models.DecimalField(decimal_places=2, max_digits=5, blank=True, default='0')
     mileage = models.IntegerField(blank=False)
     user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
         ordering = ['-date', 'vehicle']

    def __str__(self):
        return self.vehicle.name

    def get_absolute_url(self):
        return reverse('fuellog:entry_detail', kwargs={'pk':self.pk})

视图.py

class CreateEntry(CreateView):
    model = FuelEntry
    fields = ('vehicle', 'current', 'after', 'gallons', 'cost', 'mileage')

    def form_valid(self,form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        vehicle_id = self.object.vehicle.pk
        mileage = self.object.mileage
        self.object.save()

        current_mileage = Vehicle.objects.filter(id=vehicle_id).get('current_mileage')
        if current_mileage > mileage:
            raise ValidationError('Incorrect mileage reading')



    Vehicle.objects.filter(id=vehicle_id).update(current_mileage=mileage)
        return super().form_valid(form)

/fuel/new 处的 ValueError 太多值无法解包(预期为 2)

标签: djangodjango-modelsdjango-views

解决方案


推荐阅读