![](/img/trans.png)
[英]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.