Десятичному полю не удается обновить значение

#django #django-models

#django #django-модели

Вопрос:

У меня есть DemicalField и есть def() для изменения его значения. Однако значение не может быть изменено с помощью def(). Могу ли я узнать, почему?

Models.py:

 class BillingAddress(models.Model):

user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
district = models.CharField(
    max_length=2,
)
deliver = models.CharField(max_length=4, null=True)
shipping_fee = models.DecimalField(decimal_places=2, max_digits=10, default=0)

def __str__(self):
    return self.street_address

def fee_caculate(self):
    if self.deliver == 'deli':
        if self.district == 'K':
            self.shipping_fee = 20
        elif self.district == 'T':
            self.shipping_fee = 30
        else:
            self.shipping_fee = 50
    return self.shipping_fee
  

Комментарии:

1. Вы не сохраняете свой объект? Тем не менее, если значение зависит только от других полей, возможно, имеет смысл определить свойство. Таким образом, он не может достичь несогласованности.

2. Я создал объект после написания функции fee_caculate, но после этого значение shipping_fee не изменилось.

3. но дело в том, что если district и deliver полностью определяют shipping_fee , вам не нужно сохранять shipping_fee в первую очередь.

Ответ №1:

Если у вас есть модель, и вы хотите изменить значение поля, вам необходимо вызвать self.save() , чтобы зарегистрировать новое значение для этого поля в базе данных. Поэтому вам следует просто добавить:

 def fee_caculate(self):
    if self.deliver == 'deli':
        if self.district == 'K':
            self.shipping_fee = 20
        elif self.district == 'T':
            self.shipping_fee = 30
        else:
            self.shipping_fee = 50
    self.save()  #Add this method =D
    return self.shipping_fee
  

Затем, когда вы обращаетесь к этому объекту в командной строке python manage.py shell :

 billing_address = BillingAddress.objects.all()[0] 
#i'm just querying for a general object here, but you can add a filter, 
#such as .filter(user="testuser@email.com")
billing_address.shipping_fee
  

должно отображаться обновленное значение для shipping_fee .
Надеюсь, это поможет!