I have this model called Order which save the information about the user and another model called OrderItem which save the products which the user had ordered. i have join the OrderItem model with Order using Tabular Inline. Now what i want is to calculate the total price by multiplying the price and product quantity(which are the fields of OrderItem model) and save the total price in Order model as shown in the picture.
I have asked this question before but didn't get the satisfactory answer.
from django.contrib import admin
from .models import Order, OrderItem
from pizza_app.models import UserTypes
from django.db.models.signals import pre_save
from django.db.models import Sum, F, FloatField
class OrderItemInline(admin.TabularInline):
model = OrderItem
class OrderAdmin(admin.ModelAdmin):
list_display = ['id','name','total' ,'mobile_no','address','status', 'created']
list_editable = ['status']
list_per_page = 10
list_filter = ['status']
readonly_fields= ['total']
search_fields = ('id','mobile_no','name',)
inlines = [OrderItemInline]
def get_form(self, request, obj=None, **kwargs):
form = super(OrderAdmin,self).get_form(request, obj,**kwargs)
form.base_fields['Assigned_to'].queryset = form.base_fields['Assigned_to'].queryset.filter(staff_status='Delivery Boy')
return form
admin.site.register(Order, OrderAdmin)
from django.db import models
from pizza_app.models import MenuVariant
from django.urls import reverse
from django.db.models import Sum, F, FloatField
from pizza_app.models import UserTypes
# from django.contrib.auth.models import User
from django.db.models.signals import pre_save,post_save
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])
total = models.DecimalField(max_digits=10,decimal_places=2,default=0)
Assigned_to = models.OneToOneField(UserTypes, on_delete=models.CASCADE,default=None, blank=True, null=True)
class Meta:
ordering = ('created', )
def __str__(self):
return 'Order {}'.format(self.id)
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)
size = models.CharField(max_length=20, default=None)
price = models.DecimalField(max_digits=10, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
def __str__(self):
return '{}'.format(self.id)