I am a Django beginner and in one of my projects, I made this model:
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()
def __str__(self):
return (str(self.piece_length))
class Meta:
ordering = ["-order","piece_length"]
I want to multiply piece_length
with prime_pieces
to get running meters and here are my solutions:
Solution 1:
Solution: Piece.objects.annotate(running_meters = (F('piece_length') * F('prime_pieces')))
Error:TypeError: QuerySet.aggregate() received non-expression(s): <django.db.models.fields.FloatField>.
Solution 2
Solution: Piece.objects.annotate(running_meters = (F('piece_length') * F('prime_pieces')), output_field=FloatField())
Error: TypeError: QuerySet.aggregate() received non-expression(s): <django.db.models.fields.FloatField>.
Can anyone help me with a solution, please?
By uising:
(formatting added), you simply try to make an extra annotation
output_field
which maps to aFloatField
.What you need here is an
ExpressionWrapper
[Django-doc], andoutput_field=…
is a parameter ofExpressionWrapper
: