Django - Update model field based on another field
class Item(models.Model): name = models.CharField(max_length=40) default_price = models.DecimalField(max_digits=6, decimal_places=2, default=50) def __unicode__(self): return self.name class SaleDetail(models.Model): item = models.ForeignKey(Item) deposit = models.ForeignKey(Deposit) quantity = models.PositiveIntegerField() entered_unit_price = models.DecimalField(max_digits=6, decimal_places=2, default=None) sale = models.ForeignKey(Sale) @property def unit_price(self, value): if self.entered_unit_price is None: return self.item.default_price else: return self.entered_unit_price @unit_price.setter def unit_price(self, value): self.entered_unit_price = value
Then use it like so:
print(sd.unit_price)
sd.unit_price = 500
sd.save()
更好点的用法
check if there is a pk
. If the pk
is None, we know that the SaleDetail
is new. Then, we see if there is a unit_price
. If there is not a unit_price
, we set it to the Item.default_price
.
class Item(models.Model): name = models.CharField(max_length=40) default_price = models.DecimalField(max_digits=6, decimal_places=2, default=50) def __unicode__(self): return self.name class SaleDetail(models.Model): item = models.ForeignKey(Item) deposit = models.ForeignKey(Deposit) quantity = models.PositiveIntegerField() unit_price = models.DecimalField(max_digits=6, decimal_places=2) sale = models.ForeignKey(Sale) def save(self, *args, **kwargs): # Make sure this is the first save (pk should be None) and there is no unit_price set if self.pk is None and not self.unit_price: self.unit_price = self.item.default_price elif not self.unit_price: self.unit_price = self.item.default_price # Call the original save method super(SaleDetail, self).save(*args, **kwargs)
关于signal:
This calls post_save 信号会被调用
user = User.objects.get(id=1)
user.username='edited_username'
user.save()
This does not call post_save 这种写法,写好不会被调用
User.objects.filter(id=1).update(username='edited_username')
学习signal:https://simpleisbetterthancomplex.com/tutorial/2016/07/28/how-to-create-django-signals.html
深度定制django model:定制managerhttps://docs.djangoproject.com/en/3.1/topics/db/managers/