#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
.
Надеюсь, это поможет!