python - 如何使用同一模型的其他字段的值在 django 模型中创建一个字段?
问题描述
我想创建一个字段名称:total,其中包含所有产品的总价格*数量。我想要的是如何total = price*quantity
在 django 模型中进行操作。如您所见,可能有不止一种产品。
我已经通过 tabularinline 加入了 OderItem 模型和 Order。
class OrderItemInline(admin.TabularInline):
model = OrderItem
raw_id_fields = ['product']
class OrderAdmin(admin.ModelAdmin):
list_display = ['id','name', 'mobile_no','address','status', 'created']
list_editable = ['status']
list_per_page = 15
list_filter = ['status']
search_fields = ('id',)
inlines = [OrderItemInline]
admin.site.register(Order, OrderAdmin)
class Order(models.Model):
name = models.CharField(max_length=60)
email = models.EmailField(max_length=60,default=None, blank=True)
mobile_no = models.CharField(max_length=13, default=None)
address = models.CharField(max_length=150)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status_choices = (
('In Queue', 'In Queue'),
('Processing', 'Processing'),
('Ready', 'Ready'),
('Delivered', 'Delivered'),
('Paid', 'Paid'),
('Cancelled', 'Cancelled'),
)
status = models.CharField(max_length=15, choices=status_choices, default=status_choices[0][0])
class Meta:
ordering = ('created', )
def __str__(self):
return 'Order {}'.format(self.id)
def get_total_cost(self):
return sum(item.get_cost() for item in self.items.all())
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name='items',
on_delete=models.CASCADE)
product = models.ForeignKey(MenuVariant, related_name='order_items',
on_delete=models.CASCADE, default=None)
size = models.CharField(max_length=20, default=None)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
# total = models.DecimalField(max_digits=10, decimal_places=2,default=0)
def __str__(self):
return '{}'.format(self.id)
def get_cost(self):
return self.price * self.quantity
解决方案
虽然我和 dirkgroten 一样不太明白将值保存在模型字段中的意义,但您可以在模型中添加一个字段total=models.IntegerField(null=True, blank=True)
并Order
使用 apost_save
来更新值。
所以,既然你已经有了,get_total_cost()
我们可以做类似的事情:
def order_pre_save(sender, instance, **kwargs):
instance.total_cost = instance.get_total_cost()
pre_save.connect(order_pre_save, sender=Order)
编辑:正如 dirkgroten 指出的那样,您将post_save
需要OrderItem
:
def order_item_pre_save(sender, instance, **kwargs):
instance.order.total_cost = instance.order.get_total_cost()
instance.order.save()
post_save.connect(order_item_pre_save, sender=OrderItem)
而且您还需要更新删除的值:
def order_item_pre_delete(sender, instance, **kwargs):
instance.order.total_cost = instance.order.get_total_cost() - instance.get_cost()
instance.order.save()
post_delete.connect(order_item_pre_delete, sender=OrderItem)
推荐阅读
- python - Python Threading 简单程序
- amazon-s3 - 使用 S3FS 将 S3 存储桶挂载到 ec2 实例
- vuejs2 - 如何使扩展面板仅在单击右侧的折叠图标时打开?
- css - 根据不同的悬停元素更改背景
- c# - Connection string failing
- nlp - 使用 BERT 微调文本嵌入?
- swift - 快速插入/删除重定向到新页面的行
- conditional - 编译 ejs 时出现意外的令牌“else”
- python - ModuleNotFoundError:没有名为 selenium 的模块,而它安装在我的 virt env 中
- asp.net-mvc - Aurelia 获取客户端未从控制器接收数据