【问题标题】:Django: multply, sum and groupby using two modelsDjango:使用两个模型进行乘法、求和和分组
【发布时间】:2020-12-12 08:15:11
【问题描述】:

美好的一天, 我正在尝试构建一个创建订单并允许用户添加件的系统。以下是两种型号:

class Order(models.Model):

    order_slug = models.SlugField(unique=True, blank=True)
    machine = models.ForeignKey(Machine, blank=True,on_delete=models.DO_NOTHING)
    production_type = models.CharField(choices=PRODUCTION_TYPE_CHOICES, max_length=30)
    production_bond = models.CharField(choices=PRODUCTION_BOND_CHOICES, max_length=50)
    profile = models.CharField(choices=PROFILE_CHOICES, max_length=50)
    order_number = models.CharField(max_length=50)
    order_colour = models.CharField(choices=ORDER_COLOUR_CHOICES, max_length=50)
    order_finish = models.CharField(choices=ORDER_FINISH_CHOICES, max_length=10)
    order_gauge  = models.IntegerField(choices=ORDER_GAUGE_CHOICES)
    order_width   = models.IntegerField()
    date_received = models.DateTimeField(default=datetime.now)

    class Meta: 
        ordering = ["date_received", "-profile"]

    def __str__(self):
        return (str(self.order_slug))


   
class Piece(models.Model):
    
    order = models.ForeignKey(Order,on_delete=models.CASCADE)
    coil = models.ForeignKey(Cut_Material ,on_delete=models.CASCADE)
    piece_length = models.DecimalField(max_digits=4, decimal_places=2)
    prime_pieces = models.IntegerField()
    reject_pieces = models.IntegerField()
    coil_constant = models.IntegerField(blank=True)

    def __str__(self):
        return (str(self.piece_length))

    class Meta:
        ordering = ["-order","piece_length"]

这就是我想做的。

  1. 将 prime_pieces 乘以piece_length 得到每列的running_meters
  2. 我想按order_gaugeorder_number 对这些片段进行分组,然后将running_meters 相加。

建议的解决方案

piece = Piece.objects.all()
order = Order.objects.all()

第 1 步

rm_data =  Piece.objects.annotate(running_meters=ExpressionWrapper(F('piece_length') * F('prime_pieces'), output_field=FloatField())).values()

第 2 步

我不确定

有人可以帮帮我吗?

【问题讨论】:

    标签: django group-by django-annotate


    【解决方案1】:

    我已经尝试过了,摸了摸头后似乎可以工作:

    order.values('order_number','order_gauge').annotate(
    running_meters=Sum(ExpressionWrapper(F('piece__piece_length')*F('piece__prime_pieces'),output_field=FloatField())))
    

    【讨论】:

      猜你喜欢
      • 2021-07-27
      • 2019-01-06
      • 2014-10-21
      • 2016-04-02
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      相关资源
      最近更新 更多