如何在Django models类中实现多变量同值赋值 同步weight到amount
你现有的amount = models.FloatField(weight)写法不符合Django的字段定义规则,不能直接将另一个模型字段作为参数传入字段构造函数,要实现需求可以根据你的使用场景选两种方案:
方案1:amount作为可独立修改的存储字段
如果你需要amount默认取weight的值,后续可以单独修改,不需要和weight永久绑定,直接重写模型的save方法即可:
from django.db import models from django.utils import timezone from django.contrib.auth.models import User class Orders(models.Model): # 注意原写法primary_key='consignment_id'有误,该参数为布尔值,直接传True即可 consignment_id = models.IntegerField(primary_key=True, auto_created=True) order_date = models.DateTimeField(default=timezone.now) weight = models.FloatField() from_place = models.CharField(max_length=20, null=True) destination = models.CharField(max_length=20) # 先允许空值,save方法里再赋值 amount = models.FloatField(null=True, blank=True) name = models.ForeignKey(User, on_delete=models.CASCADE) status = models.CharField(max_length=20, default='Pending') def save(self, *args, **kwargs): # 仅当amount未手动赋值时,用weight填充 if self.amount is None: self.amount = self.weight super().save(*args, **kwargs)
方案2:amount和weight永久同步,不单独修改
如果你不需要单独修改amount,要求它永远和weight的值保持一致,完全没必要额外存储amount字段,用Python属性动态返回weight的值即可,还能减少数据库冗余:
from django.db import models from django.utils import timezone from django.contrib.auth.models import User class Orders(models.Model): consignment_id = models.IntegerField(primary_key=True, auto_created=True) order_date = models.DateTimeField(default=timezone.now) weight = models.FloatField() from_place = models.CharField(max_length=20, null=True) destination = models.CharField(max_length=20) name = models.ForeignKey(User, on_delete=models.CASCADE) status = models.CharField(max_length=20, default='Pending') # 动态生成amount属性,调用时直接返回weight的值 @property def amount(self): return self.weight
如果需要在数据库查询阶段使用amount做过滤、聚合操作,直接用F('weight')表达式代替F('amount')即可,效果完全一致。
内容的提问来源于stack exchange,提问作者user17489899
相关产品推荐
相关产品推荐

