[英]How to create a field in django model using values of other fields of same model?
[英]How to create a field in django model using values of other fields?
我有一个名为Order 的模型,它保存有关用户的信息,另一个名为OrderItem 的模型保存用户订购的产品。 我已经使用表格内联将 OrderItem 模型与 Order 连接起来。 现在我想要的是通过乘以价格和产品数量(这是OrderItem模型的字段)来计算总价,并将总价保存在Order模型中,如图所示。
我以前问过这个问题,但没有得到满意的答案。
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)
您可以在 OrderAdmin 中创建一个方法来在运行时生成总计,而不是创建模型字段。 然后在管理站点中显示它。 像这样:
from django.db.models import Sum, F, ExpressionWrapper, DecimalField
class OrderAdmin(admin.ModelAdmin):
list_display = ['id','name','order_total' ,'mobile_no','address','status', 'created']
list_editable = ['status']
list_per_page = 10
list_filter = ['status']
readonly_fields= ['order_total']
search_fields = ('id','mobile_no','name',)
inlines = [OrderItemInline]
def order_total(self, obj):
return obj.items.annotate(price_per_item=ExpressionWrapper(F('quantity')*F('price'), output_field=DecimalField())).aggregate(sum_total=Sum('price_per_item')).get('sum_total')
在total_order
在方法OrderAdmin
,我计算总使用顺序的聚合。 然后,我添加了total_order
到两个fields
,并readonly_fields
在OrderAdmin
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.