using .annotate on a queryset and output field is a result of function

132 views
Skip to first unread message

VISHESH MANGLA

unread,
Jun 16, 2021, 5:53:01 PM6/16/21
to Django users
Hello,

I wanted to know that how for the model below,  how can I get a queryset with  all the fields excluding the `user` and including the  output of get_output_field? Please avoid hardcoding.
One way is

`TransactionEntry.objects.defer("users").annotate(total_price=F("num_shares")*F("price_per_share"))`

but that is undesirable. I just want to use that function on the model and not hard code the formula.
Thanks,



class TransactionEntry(models.Model):
    """Model to save data of users who want to buy/sell shares"""

    user = models.ForeignKey(
        to=Relative,
        on_delete=models.CASCADE,
        related_name="transaction_entry",
    )

    num_shares = models.PositiveIntegerField(null=Falseblank=False)
    date_of_trade = models.DateField(null=Falseblank=False)
    transaction_type = models.CharField(
        max_length=1,
        choices=TransactionType.choices,
        default=TransactionType.SELL,
        null=False,
    )
    price_per_share = models.FloatField(null=Falseblank=False)

    def get_total_price(self):
        return self.num_shares * self.price_per_share

Nikeet NA

unread,
Jun 16, 2021, 11:20:27 PM6/16/21
to Django users
You cannot use properties in django orm , it does not allow that.
TransactionEntry.objects.defer("users").annotate(total_price=F("num_shares")*F("price_per_share")).values('total_price')

VISHESH MANGLA

unread,
Jun 17, 2021, 6:00:28 AM6/17/21
to Django users
what about overwriting the manager? How to make the manager auto-add those computed properties ?

Nikeet NA

unread,
Jun 17, 2021, 8:37:37 AM6/17/21
to django...@googlegroups.com
You can do it like this :

class TransactionEntry(models.Manager):
       def get_total_prices(self):
             return self.queryset().defer("users").annotate.(total_price=F("num_shares")*F("price_per_share"))

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/35d917c8-e321-42eb-8050-f7849c0374e8n%40googlegroups.com.

Nikeet NA

unread,
Jun 17, 2021, 8:38:50 AM6/17/21
to django...@googlegroups.com
Its not the perfect method you can optimize ot more if you want. 
You can prefer this Link

VISHESH MANGLA

unread,
Jun 28, 2021, 3:24:56 AM6/28/21
to django...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages