簡體   English   中英

如何使用其他字段的值在 Django 模型中創建一個字段?

[英]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_fieldsOrderAdmin

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM