繁体   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